From e343137b7f3990aa94e694687eaa19f95394c229 Mon Sep 17 00:00:00 2001 From: Balduin Date: Tue, 7 Apr 2026 09:25:11 +0200 Subject: [PATCH] fix(airspeed_selector): fix OOB array access The array access _airspeed_validator[valid_airspeed_index - 1] is only valid if valid_airspeed_index > 0. After an airspeed failure, we have valid_airspeed_index = -1 (see AirspeedSource enum definition) and are thus accessing array element -2. This is UB and pollutes the log (and potentially other modules) with garbage values. Fix: Like already done for other fields, we initialise the values with NaN and only populate (using the array access) when the airspeed source is a real sensor, and thus valid. --- src/modules/airspeed_selector/airspeed_selector_main.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/modules/airspeed_selector/airspeed_selector_main.cpp b/src/modules/airspeed_selector/airspeed_selector_main.cpp index 090456e173..29430ebcc4 100644 --- a/src/modules/airspeed_selector/airspeed_selector_main.cpp +++ b/src/modules/airspeed_selector/airspeed_selector_main.cpp @@ -751,11 +751,10 @@ void AirspeedModule::select_airspeed_and_publish() airspeed_validated.indicated_airspeed_m_s = NAN; airspeed_validated.calibrated_airspeed_m_s = NAN; airspeed_validated.true_airspeed_m_s = NAN; + airspeed_validated.airspeed_derivative_filtered = NAN; + airspeed_validated.pitch_filtered = NAN; - airspeed_validated.airspeed_derivative_filtered = _airspeed_validator[valid_airspeed_index - - 1].get_airspeed_derivative(); airspeed_validated.throttle_filtered = _throttle_filtered.getState(); - airspeed_validated.pitch_filtered = _airspeed_validator[valid_airspeed_index - 1].get_pitch_filtered(); airspeed_validated.airspeed_source = valid_airspeed_index; _prev_airspeed_src = _valid_airspeed_src; @@ -791,6 +790,8 @@ void AirspeedModule::select_airspeed_and_publish() airspeed_validated.true_airspeed_m_s = _airspeed_validator[valid_airspeed_index - 1].get_TAS(); airspeed_validated.calibrated_ground_minus_wind_m_s = _ground_minus_wind_CAS; airspeed_validated.calibraded_airspeed_synth_m_s = get_synthetic_airspeed(airspeed_validated.throttle_filtered); + airspeed_validated.airspeed_derivative_filtered = _airspeed_validator[valid_airspeed_index - 1].get_airspeed_derivative(); + airspeed_validated.pitch_filtered = _airspeed_validator[valid_airspeed_index - 1].get_pitch_filtered(); break; }