AP_GPS: fix out-of-bounds array access

This commit is contained in:
Francisco Ferreira 2019-03-05 23:24:02 +00:00 committed by Randy Mackay
parent 271bbbd8d1
commit 7e9c56c50e

View File

@ -1105,6 +1105,10 @@ bool AP_GPS::get_lag(uint8_t instance, float &lag_sec) const
// always enusre a lag is provided // always enusre a lag is provided
lag_sec = GPS_WORST_LAG_SEC; lag_sec = GPS_WORST_LAG_SEC;
if (instance >= GPS_MAX_INSTANCES) {
return false;
}
// return lag of blended GPS // return lag of blended GPS
if (instance == GPS_BLENDED_INSTANCE) { if (instance == GPS_BLENDED_INSTANCE) {
lag_sec = _blended_lag_sec; lag_sec = _blended_lag_sec;
@ -1133,12 +1137,17 @@ bool AP_GPS::get_lag(uint8_t instance, float &lag_sec) const
// return a 3D vector defining the offset of the GPS antenna in meters relative to the body frame origin // return a 3D vector defining the offset of the GPS antenna in meters relative to the body frame origin
const Vector3f &AP_GPS::get_antenna_offset(uint8_t instance) const const Vector3f &AP_GPS::get_antenna_offset(uint8_t instance) const
{ {
if (instance == GPS_MAX_RECEIVERS) { if (instance >= GPS_MAX_INSTANCES) {
// we have to return a reference so use instance 0
return _antenna_offset[0];
}
if (instance == GPS_BLENDED_INSTANCE) {
// return an offset for the blended GPS solution // return an offset for the blended GPS solution
return _blended_antenna_offset; return _blended_antenna_offset;
} else {
return _antenna_offset[instance];
} }
return _antenna_offset[instance];
} }
/* /*
@ -1526,9 +1535,20 @@ void AP_GPS::calc_blended_state(void)
timing[GPS_BLENDED_INSTANCE].last_message_time_ms = (uint32_t)temp_time_2; timing[GPS_BLENDED_INSTANCE].last_message_time_ms = (uint32_t)temp_time_2;
} }
bool AP_GPS::is_healthy(uint8_t instance) const { bool AP_GPS::is_healthy(uint8_t instance) const
return drivers[instance] != nullptr && {
last_message_delta_time_ms(instance) < GPS_MAX_DELTA_MS && if (instance >= GPS_MAX_INSTANCES) {
return false;
}
bool last_msg_valid = last_message_delta_time_ms(instance) < GPS_MAX_DELTA_MS;
if (instance == GPS_BLENDED_INSTANCE) {
return last_msg_valid && blend_health_check();
}
return last_msg_valid &&
drivers[instance] != nullptr &&
drivers[instance]->is_healthy(); drivers[instance]->is_healthy();
} }