Fix for stack-buffer-underflow in ixheaacd_sbr_env_calc

Bug:117050162
Test: vendor, poc no longer fails
Change-Id: I1ff8f0ce42ade33c93653edc9e19282b68108b9b
diff --git a/decoder/ixheaacd_esbr_envcal.c b/decoder/ixheaacd_esbr_envcal.c
index 53aacef..b90df22 100644
--- a/decoder/ixheaacd_esbr_envcal.c
+++ b/decoder/ixheaacd_esbr_envcal.c
@@ -68,11 +68,12 @@
   } while (inc > 1);
 }
 
-VOID ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
-                           FLOAT32 input_real[][64], FLOAT32 input_imag[][64],
-                           FLOAT32 input_real1[][64], FLOAT32 input_imag1[][64],
-                           WORD32 x_over_qmf[MAX_NUM_PATCHES],
-                           FLOAT32 *scratch_buff, FLOAT32 *env_out) {
+WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
+                             FLOAT32 input_real[][64], FLOAT32 input_imag[][64],
+                             FLOAT32 input_real1[][64],
+                             FLOAT32 input_imag1[][64],
+                             WORD32 x_over_qmf[MAX_NUM_PATCHES],
+                             FLOAT32 *scratch_buff, FLOAT32 *env_out) {
   WORD8 harmonics[64];
   FLOAT32(*env_tmp)[48];
   FLOAT32(*noise_level_pvc)[48];
@@ -192,6 +193,7 @@
       ui = frame_data->pstr_sbr_header->pstr_freq_band_data
                ->freq_band_tbl_hi[i + 1];
       tmp = ((ui + li) - (sub_band_start << 1)) >> 1;
+      if ((tmp >= 64) || (tmp < 0)) return -1;
 
       harmonics[tmp] = add_harmonics[i];
     }
@@ -559,6 +561,7 @@
       ui = frame_data->pstr_sbr_header->pstr_freq_band_data
                ->freq_band_tbl_hi[i + 1];
       tmp = ((ui + li) - (sub_band_start << 1)) >> 1;
+      if ((tmp >= 64) || (tmp < 0)) return -1;
 
       harmonics[tmp] = add_harmonics[i];
     }
@@ -783,6 +786,7 @@
   frame_data->phase_index = phase_index;
   frame_data->pstr_sbr_header->esbr_start_up = esbr_start_up;
   frame_data->pstr_sbr_header->esbr_start_up_pvc = esbr_start_up_pvc;
+  return 0;
 }
 
 VOID ixheaacd_createlimiterbands(WORD32 lim_table[4][12 + 1],
diff --git a/decoder/ixheaacd_sbr_dec.c b/decoder/ixheaacd_sbr_dec.c
index 1adc72a..049433d 100644
--- a/decoder/ixheaacd_sbr_dec.c
+++ b/decoder/ixheaacd_sbr_dec.c
@@ -759,21 +759,16 @@
       ptr_pvc_data->prev_pvc_rate = ptr_pvc_data->pvc_rate;
 
       ptr_frame_data->pstr_sbr_header = ptr_header_data;
-      if (ptr_header_data->hbe_flag == 0)
-        ixheaacd_sbr_env_calc(
-            ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
-            ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
-            ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
-            ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), NULL,
-            ptr_sbr_dec->scratch_buff, pvc_dec_out_buf);
-      else
-        ixheaacd_sbr_env_calc(
-            ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
-            ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
-            ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
-            ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET),
-            ptr_sbr_dec->p_hbe_txposer->x_over_qmf, ptr_sbr_dec->scratch_buff,
-            pvc_dec_out_buf);
+      err_code = ixheaacd_sbr_env_calc(
+          ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
+          ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
+          ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
+          ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET),
+          (ptr_header_data->hbe_flag == 0)
+              ? NULL
+              : ptr_sbr_dec->p_hbe_txposer->x_over_qmf,
+          ptr_sbr_dec->scratch_buff, pvc_dec_out_buf);
+      if (err_code) return err_code;
 
     } else {
       for (i = 0; i < 64; i++) {
@@ -1213,22 +1208,16 @@
   ptr_frame_data->pstr_sbr_header = ptr_header_data;
   ptr_frame_data->sbr_mode = ORIG_SBR;
   ptr_frame_data->prev_sbr_mode = ORIG_SBR;
-  if (ptr_header_data->hbe_flag == 0)
-    ixheaacd_sbr_env_calc(ptr_frame_data,
-                          ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET,
-                          ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
-                          ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET,
-                          ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
-                          NULL, ptr_sbr_dec->scratch_buff, NULL);
-  else
-    ixheaacd_sbr_env_calc(ptr_frame_data,
-                          ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET,
-                          ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
-                          ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET,
-                          ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
-                          ptr_sbr_dec->p_hbe_txposer->x_over_qmf,
-                          ptr_sbr_dec->scratch_buff, NULL);
+  err = ixheaacd_sbr_env_calc(
+      ptr_frame_data, ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET,
+      ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
+      ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET,
+      ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
+      (ptr_header_data->hbe_flag == 0) ? NULL
+                                       : ptr_sbr_dec->p_hbe_txposer->x_over_qmf,
+      ptr_sbr_dec->scratch_buff, NULL);
 
+  if (err) return err;
   for (i = 0; i < no_bins; i++) {
     FLOAT32 *p_loc_mps_qmf_output =
         p_mps_qmf_output + i * (MAX_NUM_QMF_BANDS_ESBR * 2);
diff --git a/decoder/ixheaacd_sbr_dec.h b/decoder/ixheaacd_sbr_dec.h
index 0beec6d..69a4d23 100644
--- a/decoder/ixheaacd_sbr_dec.h
+++ b/decoder/ixheaacd_sbr_dec.h
@@ -183,11 +183,12 @@
                               FLOAT32 pv_qmf_buf_imag[][64],
                               WORD32 pitch_in_bins);
 
-VOID ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
-                           FLOAT32 input_real[][64], FLOAT32 input_imag[][64],
-                           FLOAT32 input_real1[][64], FLOAT32 input_imag1[][64],
-                           WORD32 x_over_qmf[MAX_NUM_PATCHES],
-                           FLOAT32 *scratch_buff, FLOAT32 *env_out);
+WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
+                             FLOAT32 input_real[][64], FLOAT32 input_imag[][64],
+                             FLOAT32 input_real1[][64],
+                             FLOAT32 input_imag1[][64],
+                             WORD32 x_over_qmf[MAX_NUM_PATCHES],
+                             FLOAT32 *scratch_buff, FLOAT32 *env_out);
 
 WORD32 ixheaacd_generate_hf(FLOAT32 ptr_src_buf_real[][64],
                             FLOAT32 ptr_src_buf_imag[][64],