From 772efde6a711c71d28aa1dd7384a1337c2e7b187 Mon Sep 17 00:00:00 2001 From: Martijn van Beurden Date: Sat, 18 Jun 2022 16:23:30 +0200 Subject: [PATCH] Check first metadata block is streaminfo in level 1 metadata iterator In simple_iterator_prime_input_ there was no check whether the first metadata block is a streaminfo block. As the rest of the functions operate under the assumption the first block is a streaminfo block, for example to prevent the functions from deleting the last block and being left with an iterator pointing nowhere, this check is added. --- src/libFLAC/metadata_iterators.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/libFLAC/metadata_iterators.c b/src/libFLAC/metadata_iterators.c index 55562b43..5b791184 100644 --- a/src/libFLAC/metadata_iterators.c +++ b/src/libFLAC/metadata_iterators.c @@ -446,7 +446,15 @@ static FLAC__bool simple_iterator_prime_input_(FLAC__Metadata_SimpleIterator *it case 0: iterator->depth = 0; iterator->first_offset = iterator->offset[iterator->depth] = ftello(iterator->file); - return read_metadata_block_header_(iterator); + ret = read_metadata_block_header_(iterator); + /* The first metadata block must be a streaminfo. If this is not the + * case, the file is invalid and assumptions made elsewhere in the + * code are invalid */ + if(iterator->type != FLAC__METADATA_TYPE_STREAMINFO) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA; + return false; + } + return ret; case 1: iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; return false;