Prevent double free on encoder/decoder init failure.
authorGregory Maxwell <greg@xiph.org>
Sun, 4 Sep 2011 08:43:11 +0000 (04:43 -0400)
committerGregory Maxwell <greg@xiph.org>
Sun, 4 Sep 2011 08:43:11 +0000 (04:43 -0400)
src/opus_decoder.c
src/opus_encoder.c

index 4361e5b..2a4823b 100644 (file)
@@ -88,10 +88,9 @@ int opus_decoder_init(OpusDecoder *st, opus_int32 Fs, int channels)
       return OPUS_BAD_ARG;
    OPUS_CLEAR((char*)st, opus_decoder_get_size(channels));
    /* Initialize SILK encoder */
-   ret = silk_Get_Decoder_Size( &silkDecSizeBytes );
-   if( ret ) {
-      return OPUS_INTERNAL_ERROR;
-   }
+   ret = silk_Get_Decoder_Size(&silkDecSizeBytes);
+   if(ret)return OPUS_INTERNAL_ERROR;
+
    silkDecSizeBytes = align(silkDecSizeBytes);
    st->silk_dec_offset = align(sizeof(OpusDecoder));
    st->celt_dec_offset = st->silk_dec_offset+silkDecSizeBytes;
@@ -103,22 +102,17 @@ int opus_decoder_init(OpusDecoder *st, opus_int32 Fs, int channels)
 
    /* Reset decoder */
    ret = silk_InitDecoder( silk_dec );
-   if( ret ) {
-      goto failure;
-   }
+   if(ret)return OPUS_INTERNAL_ERROR;
 
    /* Initialize CELT decoder */
    ret = celt_decoder_init(celt_dec, Fs, channels);
-   if (ret != OPUS_OK)
-      goto failure;
+   if(ret!=OPUS_OK)return OPUS_INTERNAL_ERROR;
+
    celt_decoder_ctl(celt_dec, CELT_SET_SIGNALLING(0));
 
    st->prev_mode = 0;
    st->frame_size = Fs/400;
    return OPUS_OK;
-failure:
-   opus_free(st);
-   return OPUS_INTERNAL_ERROR;
 }
 
 OpusDecoder *opus_decoder_create(opus_int32 Fs, int channels, int *error)
index a88f7fd..3e07c79 100644 (file)
@@ -162,8 +162,7 @@ int opus_encoder_init(OpusEncoder* st, opus_int32 Fs, int channels, int applicat
     st->Fs = Fs;
 
     ret = silk_InitEncoder( silk_enc, &st->silk_mode );
-    if (ret)
-        goto failure;
+    if(ret)return OPUS_INTERNAL_ERROR;
 
     /* default SILK parameters */
     st->silk_mode.nChannelsAPI              = channels;
@@ -183,8 +182,8 @@ int opus_encoder_init(OpusEncoder* st, opus_int32 Fs, int channels, int applicat
     /* Create CELT encoder */
     /* Initialize CELT encoder */
     err = celt_encoder_init(celt_enc, Fs, channels);
-    if (err != OPUS_OK)
-        goto failure;
+    if(err!=OPUS_OK)return OPUS_INTERNAL_ERROR;
+
     celt_encoder_ctl(celt_enc, CELT_SET_SIGNALLING(0));
 
     st->use_vbr = 0;
@@ -213,10 +212,6 @@ int opus_encoder_init(OpusEncoder* st, opus_int32 Fs, int channels, int applicat
     st->bandwidth = OPUS_BANDWIDTH_FULLBAND;
 
     return OPUS_OK;
-
-failure:
-    opus_free(st);
-    return OPUS_INTERNAL_ERROR;
 }
 
 static unsigned char gen_toc(int mode, int framerate, int bandwidth, int silk_bandwidth, int channels)