From 4ec1422bd951a137225ffa4052da120e2ab0a0f4 Mon Sep 17 00:00:00 2001 From: nu774 Date: Wed, 13 Jul 2022 20:56:49 +0900 Subject: [PATCH] wav/caf parser: ensure fmt/desc chunk fixes https://github.com/nu774/fdkaac/issues/52 --- src/caf_reader.c | 8 +++++--- src/wav_reader.c | 6 ++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/caf_reader.c b/src/caf_reader.c index 71d21c9..05b2151 100644 --- a/src/caf_reader.c +++ b/src/caf_reader.c @@ -172,6 +172,7 @@ int caf_parse(caf_reader_t *reader, int64_t *data_length) { uint32_t fcc; int64_t chunk_size; + int desc_seen = 0; *data_length = 0; @@ -181,9 +182,10 @@ int caf_parse(caf_reader_t *reader, int64_t *data_length) TRY_IO(pcm_skip(&reader->io, 4)); /* mFileVersion, mFileFlags */ while ((fcc = caf_next_chunk(reader, &chunk_size)) != 0) { - if (fcc == M4AF_FOURCC('d','e','s','c')) + if (fcc == M4AF_FOURCC('d','e','s','c')) { + desc_seen = 1; TRY_IO(caf_desc(reader, chunk_size)); - else if (fcc == M4AF_FOURCC('i','n','f','o')) + } else if (fcc == M4AF_FOURCC('i','n','f','o')) TRY_IO(caf_info(reader, chunk_size)); else if (fcc == M4AF_FOURCC('c','h','a','n')) { ENSURE(reader->sample_format.channels_per_frame); @@ -199,7 +201,7 @@ int caf_parse(caf_reader_t *reader, int64_t *data_length) TRY_IO(pcm_skip(&reader->io, chunk_size)); } ENSURE(reader->sample_format.channels_per_frame); - ENSURE(fcc == M4AF_FOURCC('d','a','t','a')); + ENSURE(desc_seen && fcc == M4AF_FOURCC('d','a','t','a')); return 0; FAIL: return -1; diff --git a/src/wav_reader.c b/src/wav_reader.c index 2690d24..4c6cc66 100644 --- a/src/wav_reader.c +++ b/src/wav_reader.c @@ -155,6 +155,7 @@ static int wav_parse(wav_reader_t *reader, int64_t *data_length) { uint32_t container, fcc, chunk_size; + int fmt_seen = 0; *data_length = 0; container = riff_next_chunk(reader, &chunk_size); @@ -167,6 +168,7 @@ int wav_parse(wav_reader_t *reader, int64_t *data_length) riff_ds64(reader, data_length); while ((fcc = riff_next_chunk(reader, &chunk_size)) != 0) { if (fcc == RIFF_FOURCC('f','m','t',' ')) { + fmt_seen = 1; if (wav_fmt(reader, chunk_size) < 0) goto FAIL; } else if (fcc == RIFF_FOURCC('d','a','t','a')) { @@ -178,8 +180,8 @@ int wav_parse(wav_reader_t *reader, int64_t *data_length) TRY_IO(pcm_skip(&reader->io, (chunk_size + 1) & ~1)); } } - if (fcc == RIFF_FOURCC('d','a','t','a')) - return 0; + ENSURE(fmt_seen && fcc == RIFF_FOURCC('d', 'a', 't', 'a')); + return 0; FAIL: return -1; }