avcodec/dirac_vlc: Fix undefined shift

Fixes: runtime error: shift exponent 64 is too large for 64-bit type 'residual' (aka 'unsigned long')
Fixes: 2674/clusterfuzz-testcase-minimized-4999700518273024

Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
pull/265/head
Michael Niedermayer 8 years ago
parent 7e9f550003
commit 69e7daf6ce
  1. 9
      libavcodec/dirac_vlc.c

@ -216,9 +216,14 @@ static void generate_offset_lut(DiracGolombLUT *lut, int off)
INIT_RESIDUE(res); INIT_RESIDUE(res);
SET_RESIDUE(res, idx, LUT_BITS); SET_RESIDUE(res, idx, LUT_BITS);
l->preamble = CONVERT_TO_RESIDUE(res >> (RSIZE_BITS - off), off);
l->preamble_bits = off; l->preamble_bits = off;
l->sign = ((l->preamble >> (RSIZE_BITS - l->preamble_bits)) & 1) ? -1 : +1; if (off) {
l->preamble = CONVERT_TO_RESIDUE(res >> (RSIZE_BITS - off), off);
l->sign = ((l->preamble >> (RSIZE_BITS - l->preamble_bits)) & 1) ? -1 : +1;
} else {
l->preamble = 0;
l->sign = 1;
}
search_for_golomb(l, res << off, LUT_BITS - off); search_for_golomb(l, res << off, LUT_BITS - off);
} }

Loading…
Cancel
Save