Browse Source

lafv/wavdec: Fail bext parsing on incomplete reads

avio_read can successfully return even when less than the requested
amount of input was read. wavdec's bext parsing mistakenly assumed a
successful avio_read always read the full amount that was requested.
The result could be dictionary tags populated with partially
uninitialized values.

This change also fixes a broken assertion in wav_parse_bext_string that
was off-by-one, though no known current usage of that method hits that
broken case.

Chromium bug: 987270

Signed-off-by: Matt Wolenetz <wolenetz@chromium.org>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
(cherry picked from commit 052d41377a)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
tags/n3.2.15
Matt Wolenetz Michael Niedermayer 6 years ago
parent
commit
debbbb5ba6
1 changed files with 7 additions and 5 deletions
  1. +7
    -5
      libavformat/wavdec.c

+ 7
- 5
libavformat/wavdec.c View File

@@ -230,9 +230,9 @@ static inline int wav_parse_bext_string(AVFormatContext *s, const char *key,
char temp[257];
int ret;

av_assert0(length <= sizeof(temp));
if ((ret = avio_read(s->pb, temp, length)) < 0)
return ret;
av_assert0(length < sizeof(temp));
if ((ret = avio_read(s->pb, temp, length)) != length)
return ret < 0 ? ret : AVERROR_INVALIDDATA;

temp[length] = 0;

@@ -301,8 +301,10 @@ static int wav_parse_bext_tag(AVFormatContext *s, int64_t size)
if (!(coding_history = av_malloc(size + 1)))
return AVERROR(ENOMEM);

if ((ret = avio_read(s->pb, coding_history, size)) < 0)
return ret;
if ((ret = avio_read(s->pb, coding_history, size)) != size) {
av_free(coding_history);
return ret < 0 ? ret : AVERROR_INVALIDDATA;
}

coding_history[size] = 0;
if ((ret = av_dict_set(&s->metadata, "coding_history", coding_history,


Loading…
Cancel
Save