diff options
author | Shashank Pathmudi <shashank.pathmudi@ittiam.com> | 2023-10-05 15:15:23 +0530 |
---|---|---|
committer | sandeshvenkatesh <89826624+sandeshvenkatesh@users.noreply.github.com> | 2023-10-05 16:01:11 +0530 |
commit | 2d79f3ac5944f3924bd895c22cdcb993dac97a4d (patch) | |
tree | fd85d6bad7bdecffb38d80b5754b43180be386eb | |
parent | 0c86a5d8fabe7ab275ff56caed9e4293e627c525 (diff) | |
download | libxaac-2d79f3ac5944f3924bd895c22cdcb993dac97a4d.tar.gz |
Fix for divide-by-zero in ixheaacd_sbr_env_calc
These changes handle the divide-by-zero runtime error reported
while calculating energy gain.
Bug: ossFuzz:62903
Test: poc in bug
-rw-r--r-- | decoder/ixheaacd_esbr_envcal.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/decoder/ixheaacd_esbr_envcal.c b/decoder/ixheaacd_esbr_envcal.c index ebf4ae7..677c616 100644 --- a/decoder/ixheaacd_esbr_envcal.c +++ b/decoder/ixheaacd_esbr_envcal.c @@ -150,6 +150,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 WORD32 band_loop_end; WORD32 rate = upsamp_4_flag ? 4 : 2; + FLOAT64 guard = 1e-17; if (ldmps_present == 1) rate = 1; @@ -349,7 +350,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 nrg_tone_pvc[c][t] = 0.0f; tmp = frame_data->qmapped_pvc[c][t] / - (1 + frame_data->qmapped_pvc[c][t]); + (1 + frame_data->qmapped_pvc[c][t] + guard); if (flag) { nrg_gain_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp / @@ -359,7 +360,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 (harmonics[c] && (t >= frame_data->sine_position || (*harm_flag_prev)[c + sub_band_start])) ? sqrt(nrg_ref_pvc[c][t] * tmp / - frame_data->qmapped_pvc[c][t]) + (frame_data->qmapped_pvc[c][t] + guard)) : nrg_tone_pvc[c][t]); nrg_tone_pvc[c][t] = (FLOAT32)( @@ -376,7 +377,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 } else { nrg_gain_pvc[c][t] = (FLOAT32)sqrt( nrg_ref_pvc[c][t] * tmp / - ((nrg_est_pvc[c][t] + 1) * frame_data->qmapped_pvc[c][t])); + ((nrg_est_pvc[c][t] + 1) * (frame_data->qmapped_pvc[c][t] + guard))); } } @@ -400,7 +401,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 k < (*lim_table)[limiter_band][c + 1]; k++) { if (g_max <= nrg_gain_pvc[k][t]) { noise_level_pvc[k][t] = - noise_level_pvc[k][t] * (g_max / nrg_gain_pvc[k][t]); + (FLOAT32)(noise_level_pvc[k][t] * (g_max / (nrg_gain_pvc[k][t] + guard))); nrg_gain_pvc[k][t] = g_max; } @@ -473,7 +474,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 nrg_tone_pvc[c][t] = 0.0f; tmp = frame_data->qmapped_pvc[c][t] / - (1 + frame_data->qmapped_pvc[c][t]); + (1 + frame_data->qmapped_pvc[c][t] + guard); if (flag) { nrg_gain_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp / @@ -483,7 +484,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 (harmonics[c] && (t >= frame_data->sine_position || (*harm_flag_prev)[c + sub_band_start])) ? sqrt(nrg_ref_pvc[c][t] * tmp / - frame_data->qmapped_pvc[c][t]) + (frame_data->qmapped_pvc[c][t] + guard)) : nrg_tone_pvc[c][t]); } else { if (noise_absc_flag) { @@ -492,7 +493,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 } else { nrg_gain_pvc[c][t] = (FLOAT32)sqrt( nrg_ref_pvc[c][t] * tmp / - ((nrg_est_pvc[c][t] + 1) * frame_data->qmapped_pvc[c][t])); + ((nrg_est_pvc[c][t] + 1) * (frame_data->qmapped_pvc[c][t] + guard))); } } @@ -645,7 +646,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data ->freq_band_tbl_noise[o + 1]; - if (p_frame_info->border_vec[i] == p_frame_info->border_vec[i + 1]) { + if (p_frame_info->border_vec[i] >= p_frame_info->border_vec[i + 1]) { for (flag = 0, k = li; k < ui; k++) { flag = (harmonics[c] && (i >= trans_env || (*harm_flag_prev)[c + sub_band_start])) @@ -677,7 +678,6 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 c -= (ui - li); for (k = 0; k < ui - li; k++) { - FLOAT64 guard = 1e-17; o = (k + li >= ui2) ? o + 1 : o; if (o >= MAX_NOISE_COEFFS) { if (ec_flag) @@ -691,7 +691,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 nrg_est[c] = (!int_mode) ? nrg : nrg_est[c]; nrg_tone[c] = 0; tmp = noise_floor[next * num_nf_bands + o] / - (1 + noise_floor[next * num_nf_bands + o]); + (1 + noise_floor[next * num_nf_bands + o] + guard); if (flag) { nrg_gain[c] = (FLOAT32)sqrt(nrg_ref[c] * tmp / (nrg_est[c] + 1)); nrg_tone[c] = (FLOAT32)( @@ -728,7 +728,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 for (k = (*lim_table)[limiter_band][c]; k < (*lim_table)[limiter_band][c + 1]; k++) { if (g_max <= nrg_gain[k]) { - noise_level[k] = noise_level[k] * (g_max / nrg_gain[k]); + noise_level[k] = (FLOAT32)(noise_level[k] * (g_max / (nrg_gain[k] + guard))); nrg_gain[k] = g_max; } } |