[SCM] libav/experimental: Add a few size checks when decoding rtjpeg blocks. Might avoid crashes in unlikely cases, but mostly avoids ugly artefacts for partial frames.
siretart at users.alioth.debian.org
siretart at users.alioth.debian.org
Sun Jun 30 16:46:25 UTC 2013
The following commit has been merged in the experimental branch:
commit 8d857c543402911f46ad38b093ab9aaf5b9a9a18
Author: Reimar Döffinger <Reimar.Doeffinger at gmx.de>
Date: Sun May 24 09:03:45 2009 +0000
Add a few size checks when decoding rtjpeg blocks.
Might avoid crashes in unlikely cases, but mostly avoids ugly artefacts
for partial frames.
Originally committed as revision 18925 to svn://svn.ffmpeg.org/ffmpeg/trunk
diff --git a/libavcodec/rtjpeg.c b/libavcodec/rtjpeg.c
index 2736807..ec31656 100644
--- a/libavcodec/rtjpeg.c
+++ b/libavcodec/rtjpeg.c
@@ -55,6 +55,9 @@ static inline int get_block(GetBitContext *gb, DCTELEM *block, const uint8_t *sc
// number of non-zero coefficients
coeff = get_bits(gb, 6);
+ if (get_bits_count(gb) + (coeff << 1) >= gb->size_in_bits)
+ return 0;
+
// normally we would only need to clear the (63 - coeff) last values,
// but since we do not know where they are we just clear the whole block
memset(block, 0, 64 * sizeof(DCTELEM));
@@ -69,6 +72,8 @@ static inline int get_block(GetBitContext *gb, DCTELEM *block, const uint8_t *sc
// 4 bits per coefficient
ALIGN(4);
+ if (get_bits_count(gb) + (coeff << 2) >= gb->size_in_bits)
+ return 0;
while (coeff) {
ac = get_sbits(gb, 4);
if (ac == -8)
@@ -78,6 +83,8 @@ static inline int get_block(GetBitContext *gb, DCTELEM *block, const uint8_t *sc
// 8 bits per coefficient
ALIGN(8);
+ if (get_bits_count(gb) + (coeff << 3) >= gb->size_in_bits)
+ return 0;
while (coeff) {
ac = get_sbits(gb, 8);
PUT_COEFF(ac);
--
Libav/FFmpeg packaging
More information about the pkg-multimedia-commits
mailing list