diff options
author | Martijn van Beurden <mvanb1@gmail.com> | 2022-02-02 20:30:36 +0100 |
---|---|---|
committer | Martijn van Beurden <mvanb1@gmail.com> | 2022-05-01 17:35:36 +0200 |
commit | 3fc5ba46375e48009cd9428091cd2ffd242de6b9 (patch) | |
tree | 24fe60258aa077ffea3daa6019adfba6b0ff6c38 /src | |
parent | ee9c07aa22e8393b914cd049637dea5676dd2edc (diff) | |
download | flac-3fc5ba46375e48009cd9428091cd2ffd242de6b9.tar.gz |
Replace seek error with handling when hitting EOF while reading frame
Diffstat (limited to 'src')
-rw-r--r-- | src/libFLAC/stream_decoder.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/libFLAC/stream_decoder.c b/src/libFLAC/stream_decoder.c index 31f07e7d..5f38aa63 100644 --- a/src/libFLAC/stream_decoder.c +++ b/src/libFLAC/stream_decoder.c @@ -3334,8 +3334,14 @@ FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 s * FLAC__stream_decoder_process_single() to return false. */ decoder->private_->unparseable_frame_count = 0; - if(!FLAC__stream_decoder_process_single(decoder) || - decoder->protected_->state == FLAC__STREAM_DECODER_ABORTED) { + if(!FLAC__stream_decoder_process_single(decoder) && decoder->private_->eof_callback(decoder, decoder->private_->client_data)){ + /* decoder has hit end of stream while processing corrupt + * frame, try again. This is very inefficient but shouldn't + * happen often, and a more efficient solution would require + * quite a bit more code */ + upper_bound--; + continue; + }else if(decoder->protected_->state == FLAC__STREAM_DECODER_ABORTED) { decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; return false; } |