mirror of https://git.ffmpeg.org/ffmpeg.git
avcodec/tiff: Restrict tag order based on specification
"The entries in an IFD must be sorted in ascending order by Tag. Note that this is
not the order in which the fields are described in this document."
This way various dimensions, sample and bit sizes cannot be changed at
arbitrary times which reduces the potential for bugs.
The tag reading code also on various places assumes that numerically previous
tags have already been parsed, so this needs to be enforced one way or another.
If this commit causes problems with real world files which are not easy to fix
then some other form of checks are needed to ensure the various dependencies
in the tag reading are not violated.
Fixes: out of array access
Fixes: 24825/clusterfuzz-testcase-minimized-ffmpeg_AV_CODEC_ID_TIFF_fuzzer-6326925027704832
Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
(cherry picked from commit ad29f9e47c
)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
73634e04f2
commit
71b1422ee9
|
@ -73,6 +73,7 @@ typedef struct TiffContext {
|
||||||
int fill_order;
|
int fill_order;
|
||||||
uint32_t res[4];
|
uint32_t res[4];
|
||||||
int is_thumbnail;
|
int is_thumbnail;
|
||||||
|
unsigned last_tag;
|
||||||
|
|
||||||
int is_bayer;
|
int is_bayer;
|
||||||
uint8_t pattern[4];
|
uint8_t pattern[4];
|
||||||
|
@ -933,6 +934,12 @@ static int tiff_decode_tag(TiffContext *s, AVFrame *frame)
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
if (tag <= s->last_tag)
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
|
// We ignore TIFF_STRIP_SIZE as it is sometimes in the logic but wrong order around TIFF_STRIP_OFFS
|
||||||
|
if (tag != TIFF_STRIP_SIZE)
|
||||||
|
s->last_tag = tag;
|
||||||
|
|
||||||
off = bytestream2_tell(&s->gb);
|
off = bytestream2_tell(&s->gb);
|
||||||
if (count == 1) {
|
if (count == 1) {
|
||||||
|
@ -1430,6 +1437,7 @@ again:
|
||||||
s->is_bayer = 0;
|
s->is_bayer = 0;
|
||||||
s->cur_page = 0;
|
s->cur_page = 0;
|
||||||
s->tiff_type = TIFF_TYPE_TIFF;
|
s->tiff_type = TIFF_TYPE_TIFF;
|
||||||
|
s->last_tag = 0;
|
||||||
free_geotags(s);
|
free_geotags(s);
|
||||||
|
|
||||||
// Reset these offsets so we can tell if they were set this frame
|
// Reset these offsets so we can tell if they were set this frame
|
||||||
|
|
Loading…
Reference in New Issue