diff --git a/src/opus_decoder.c b/src/opus_decoder.c index ed2f8c7307b5a0031cabdba2b2a899496f04ce38..b06725e2b9ae3d30a7158613a2ae2029f408ed06 100644 --- a/src/opus_decoder.c +++ b/src/opus_decoder.c @@ -218,7 +218,10 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, 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 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data, 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 opus_decode(OpusDecoder *st, const unsigned char *data, 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); diff --git a/src/opus_encoder.c b/src/opus_encoder.c index fc7e4f8f37aceac7768dd4705e696439c97b0af9..5dda665232360fe54293a8cc00b052e0ec8d44c9 100644 --- a/src/opus_encoder.c +++ b/src/opus_encoder.c @@ -779,15 +779,23 @@ int opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_size, 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 @@ int opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_size, 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 @@ int opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_size, 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 @@ int opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_size, { 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 @@ int opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_size, 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 @@ int opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_size, 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 @@ int opus_encode_float(OpusEncoder *st, const float *pcm, int frame_size, 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);