mirror of https://git.ffmpeg.org/ffmpeg.git
avformat/vividas: improve extradata packing checks in track_header()
Fixes: out of array accesses Fixes: 26622/clusterfuzz-testcase-minimized-ffmpeg_dem_VIVIDAS_fuzzer-6581200338288640 Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
437b7302b0
commit
27a99e2c7d
|
@ -28,6 +28,7 @@
|
||||||
* @sa http://wiki.multimedia.cx/index.php?title=Vividas_VIV
|
* @sa http://wiki.multimedia.cx/index.php?title=Vividas_VIV
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "libavutil/avassert.h"
|
||||||
#include "libavutil/intreadwrite.h"
|
#include "libavutil/intreadwrite.h"
|
||||||
#include "avio_internal.h"
|
#include "avio_internal.h"
|
||||||
#include "avformat.h"
|
#include "avformat.h"
|
||||||
|
@ -379,7 +380,7 @@ static int track_header(VividasDemuxContext *viv, AVFormatContext *s, uint8_t *
|
||||||
|
|
||||||
if (avio_tell(pb) < off) {
|
if (avio_tell(pb) < off) {
|
||||||
int num_data;
|
int num_data;
|
||||||
int xd_size = 0;
|
int xd_size = 1;
|
||||||
int data_len[256];
|
int data_len[256];
|
||||||
int offset = 1;
|
int offset = 1;
|
||||||
uint8_t *p;
|
uint8_t *p;
|
||||||
|
@ -393,10 +394,10 @@ static int track_header(VividasDemuxContext *viv, AVFormatContext *s, uint8_t *
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
data_len[j] = len;
|
data_len[j] = len;
|
||||||
xd_size += len;
|
xd_size += len + 1 + len/255;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = ff_alloc_extradata(st->codecpar, 64 + xd_size + xd_size / 255);
|
ret = ff_alloc_extradata(st->codecpar, xd_size);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -405,9 +406,7 @@ static int track_header(VividasDemuxContext *viv, AVFormatContext *s, uint8_t *
|
||||||
|
|
||||||
for (j = 0; j < num_data - 1; j++) {
|
for (j = 0; j < num_data - 1; j++) {
|
||||||
unsigned delta = av_xiphlacing(&p[offset], data_len[j]);
|
unsigned delta = av_xiphlacing(&p[offset], data_len[j]);
|
||||||
if (delta > data_len[j]) {
|
av_assert0(delta <= xd_size - offset);
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
offset += delta;
|
offset += delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -418,6 +417,7 @@ static int track_header(VividasDemuxContext *viv, AVFormatContext *s, uint8_t *
|
||||||
av_freep(&st->codecpar->extradata);
|
av_freep(&st->codecpar->extradata);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
av_assert0(data_len[j] <= xd_size - offset);
|
||||||
offset += data_len[j];
|
offset += data_len[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue