shithub: opus

Download patch

ref: c7921088292675c5f6691193a32fff68f36bf296
parent: c0387ff23739cb450eb41acd078763dd7ab9ec94
author: Jean-Marc Valin <[email protected]>
date: Mon Mar 5 14:56:13 EST 2012

Adds missing RESTORE_STACK statements on error paths

Thanks to Vincent Penquerc'h

--- a/src/opus_decoder.c
+++ b/src/opus_decoder.c
@@ -218,7 +218,10 @@
    F5 = F10>>1;
    F2_5 = F5>>1;
    if (frame_size < F2_5)
+   {
+      RESTORE_STACK;
       return OPUS_BUFFER_TOO_SMALL;
+   }
    /* Payloads of 1 (2 including ToC) or 0 trigger the PLC/DTX */
    if (len<=1)
    {
@@ -253,7 +256,10 @@
       do {
          int ret = opus_decode_frame(st, NULL, 0, pcm, F20, 0);
          if (ret != F20)
+         {
+            RESTORE_STACK;
             return OPUS_INTERNAL_ERROR;
+         }
          pcm += F20*st->channels;
          nb_samples += F20;
       } while (nb_samples < frame_size);
@@ -767,7 +773,11 @@
    int ret, i;
    ALLOC_STACK;
 
-   if(frame_size<0)return OPUS_BAD_ARG;
+   if(frame_size<0)
+   {
+      RESTORE_STACK;
+      return OPUS_BAD_ARG;
+   }
 
    ALLOC(out, frame_size*st->channels, float);
 
--- a/src/opus_encoder.c
+++ b/src/opus_encoder.c
@@ -779,15 +779,23 @@
              st->user_forced_mode = MODE_CELT_ONLY;
           tmp_len = opus_encode_native(st, pcm+i*(st->channels*st->Fs/50), st->Fs/50, tmp_data+i*bytes_per_frame, bytes_per_frame);
           if (tmp_len<0)
+          {
+             RESTORE_STACK;
              return OPUS_INTERNAL_ERROR;
+          }
           ret = opus_repacketizer_cat(&rp, tmp_data+i*bytes_per_frame, tmp_len);
           if (ret<0)
+          {
+             RESTORE_STACK;
              return OPUS_INTERNAL_ERROR;
+          }
        }
        ret = opus_repacketizer_out(&rp, data, out_data_bytes);
        if (ret<0)
+       {
+          RESTORE_STACK;
           return OPUS_INTERNAL_ERROR;
-
+       }
        st->user_forced_mode = bak_mode;
        st->user_bandwidth = bak_bandwidth;
        st->force_channels = bak_channels;
@@ -949,6 +957,7 @@
         if( ret ) {
             /*fprintf (stderr, "SILK encode error: %d\n", ret);*/
             /* Handle error */
+           RESTORE_STACK;
            return OPUS_INTERNAL_ERROR;
         }
         if (nBytes==0)
@@ -1124,7 +1133,10 @@
         celt_encoder_ctl(celt_enc, OPUS_SET_VBR(0));
         err = celt_encode_with_ec(celt_enc, pcm_buf, st->Fs/200, data+nb_compr_bytes, redundancy_bytes, NULL);
         if (err < 0)
-            return OPUS_INTERNAL_ERROR;
+        {
+           RESTORE_STACK;
+           return OPUS_INTERNAL_ERROR;
+        }
         celt_encoder_ctl(celt_enc, OPUS_GET_FINAL_RANGE(&redundant_rng));
         celt_encoder_ctl(celt_enc, OPUS_RESET_STATE);
     }
@@ -1147,7 +1159,10 @@
         {
            ret = celt_encode_with_ec(celt_enc, pcm_buf, frame_size, NULL, nb_compr_bytes, &enc);
            if (ret < 0)
+           {
+              RESTORE_STACK;
               return OPUS_INTERNAL_ERROR;
+           }
         }
     }
 
@@ -1169,7 +1184,10 @@
 
         err = celt_encode_with_ec(celt_enc, pcm_buf+st->channels*(frame_size-N2), N2, data+nb_compr_bytes, redundancy_bytes, NULL);
         if (err < 0)
-            return OPUS_INTERNAL_ERROR;
+        {
+           RESTORE_STACK;
+           return OPUS_INTERNAL_ERROR;
+        }
         celt_encoder_ctl(celt_enc, OPUS_GET_FINAL_RANGE(&redundant_rng));
     }
 
@@ -1212,7 +1230,10 @@
     if (!st->use_vbr && ret >= 3)
     {
        if (pad_frame(data, ret, max_data_bytes))
+       {
+          RESTORE_STACK;
           return OPUS_INTERNAL_ERROR;
+       }
        ret = max_data_bytes;
     }
     RESTORE_STACK;
@@ -1229,7 +1250,11 @@
    VARDECL(opus_int16, in);
    ALLOC_STACK;
 
-   if(frame_size<0)return OPUS_BAD_ARG;
+   if(frame_size<0)
+   {
+      RESTORE_STACK;
+      return OPUS_BAD_ARG;
+   }
 
    ALLOC(in, frame_size*st->channels, opus_int16);