diff options
author | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2021-11-21 01:57:41 +0100 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2022-01-11 15:15:53 +0100 |
commit | f82aaea3ff35c171ffe5b894026eacbc3c0574de (patch) | |
tree | ce88a237b1267407f372b5692c405ca574e82f74 | |
parent | de82f92b845e8e5e52ea107702eba11ea277800a (diff) | |
download | ffmpeg-f82aaea3ff35c171ffe5b894026eacbc3c0574de.tar.gz |
avcodec/h263: Fix global-buffer-overflow with noout flag2 set
h263_get_motion_length() forgot to take an absolute value;
as a consequence, a negative index was used to access an array.
This leads to potential crashes, but mostly it just accesses what
is to the left of ff_mvtab (unless one uses ASAN), thereby defeating
the purpose of the AV_CODEC_FLAG2_NO_OUTPUT because the sizes of
the returned packets differ from the sizes the encoder would actually
have produced.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
(cherry picked from commit 9207dc3b0db368bb9cf5eb295cbc1129c2975e31)
-rw-r--r-- | libavcodec/h263.h | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/libavcodec/h263.h b/libavcodec/h263.h index 491f2e0aac..f5355e7ced 100644 --- a/libavcodec/h263.h +++ b/libavcodec/h263.h @@ -100,15 +100,16 @@ void ff_h263_encode_motion(PutBitContext *pb, int val, int f_code); static inline int h263_get_motion_length(int val, int f_code){ - int l, bit_size, code; + int bit_size, code, sign; if (val == 0) { return ff_mvtab[0][1]; } else { bit_size = f_code - 1; /* modulo encoding */ - l= INT_BIT - 6 - bit_size; - val = (val<<l)>>l; + val = sign_extend(val, 6 + bit_size); + sign = val >> 31; + val = (val ^ sign) - sign; /* val = FFABS(val) */ val--; code = (val >> bit_size) + 1; |