From 76a2c8cdd49d77ab9fa0db42b0a70428fdafd0a2 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Tue, 3 Sep 2013 22:55:21 +0000 Subject: [PATCH] flacdec: Avoid busy loop. May happen when the last frame of a stream is incomplete. --- flacdec_filter.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/flacdec_filter.c b/flacdec_filter.c index b51ac3bd..01937e93 100644 --- a/flacdec_filter.c +++ b/flacdec_filter.c @@ -63,6 +63,16 @@ static FLAC__StreamDecoderReadStatus read_cb( } if (*bytes > 0) return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + /** + * Nothing was copied. If the input queue of the btrn is smaller than + * the minimal input queue size, our parent must have been gone, so + * we're not going to get more input. Since our remaining data is not + * sufficient do decode a single frame, we have an EOF condition. + */ + if (btr_get_input_queue_size(btrn) < fn->min_iqs) { + assert(btr_no_parent(btrn)); + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + } /* * We are kind of screwed here. Returning CONTINUE with a byte count of * zero leads to an endless loop, so we must return either EOF or -- 2.30.2