X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=spxdec_filter.c;h=5aa78b44bf79314dda28e82a83f0153f63d35e6d;hp=4c7a773b51f4d7491c5304a325b09dfdb29cdccd;hb=a35c113e0bb9fa9ac02b77eb01dd32f49cd5c8d0;hpb=4d9d588c5df359c3c5f279fbfd4ea51d3a2afc87 diff --git a/spxdec_filter.c b/spxdec_filter.c index 4c7a773b..5aa78b44 100644 --- a/spxdec_filter.c +++ b/spxdec_filter.c @@ -1,8 +1,8 @@ /* * Copyright (C) 2002-2006 Jean-Marc Valin - * Copyright (C) 2010-2014 Andre Noll + * Copyright (C) 2010 Andre Noll * - * Licensed under the GPL v2. For licencing details see COPYING. + * Licensed under the GPL v2, see file COPYING. */ /** \file spxdec_filter.c Paraslash's ogg/speex decoder. */ @@ -50,7 +50,6 @@ #include "para.h" #include "list.h" #include "sched.h" -#include "ggo.h" #include "buffer_tree.h" #include "filter.h" #include "error.h" @@ -75,7 +74,7 @@ struct private_spxdec_data { int lookahead; /** The state information about the current stream. */ ogg_stream_state os; - /** Whether \a os initialized. */ + /** Whether \a os is initialized. */ bool stream_init; }; @@ -128,7 +127,14 @@ static int speexdec_init(struct filter_node *fn) #define le_short(s) ((short) (s)) #endif +/** + * Size of the output buffer. + * + * Valid streams have frame sizes in the range from 160 to 640. To avoid buffer + * overflows, we bail out if the decoder reports a value bigger than this. + */ #define MAX_FRAME_SIZE 2000 + /* Copy Ogg packet to Speex bitstream */ static int speexdec_write_frames(int packet_no, struct private_spxdec_data *psd, int skip_samples, @@ -139,7 +145,14 @@ static int speexdec_write_frames(int packet_no, for (j = 0; j != psd->shi.nframes; j++) { short output[MAX_FRAME_SIZE], *btr_output; int skip = skip_samples + psd->lookahead, skip_idx = 0; - int samples, new_frame_size = psd->shi.frame_size; + int samples, this_frame_size, + new_frame_size = psd->shi.frame_size; + + if (speex_decoder_ctl(psd->shi.state, SPEEX_GET_FRAME_SIZE, + &this_frame_size) == 0) { + if (this_frame_size > MAX_FRAME_SIZE) + return -E_SPX_DECODE_OVERFLOW; + }; if (speex_decode_int(psd->shi.state, &psd->bits, output) < 0) return -E_SPX_DECODE; @@ -294,16 +307,10 @@ fail: return ret; } -/** - * The init function of the ogg/speex decoder. - * - * \param f Its fields are filled in by the function. - */ -void spxdec_filter_init(struct filter *f) -{ - f->open = spxdec_open; - f->close = speexdec_close; - f->pre_select = generic_filter_pre_select; - f->post_select = speexdec_post_select; - f->execute = speexdec_execute; -} +const struct filter lsg_filter_cmd_com_spxdec_user_data = { + .open = spxdec_open, + .close = speexdec_close, + .pre_select = generic_filter_pre_select, + .post_select = speexdec_post_select, + .execute = speexdec_execute, +};