diff options
author | Luca Barbato <lu_zero@gentoo.org> | 2017-07-08 21:04:44 +0200 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2017-07-09 12:56:15 +0200 |
commit | 79f64f7ebc2b2b7030c6219914bc141cc03fd377 (patch) | |
tree | d14d3329e4ff78b6ffedcca63ee0444ef8256e7d /libavcodec | |
parent | fd92dafaff8844b5fedf94679b93d953939a7f7b (diff) | |
download | ffmpeg-streaming-79f64f7ebc2b2b7030c6219914bc141cc03fd377.zip ffmpeg-streaming-79f64f7ebc2b2b7030c6219914bc141cc03fd377.tar.gz |
bitstream: Avoid undefined behavior in bitstream_skip()
Do not use skip_remaining() to fully wipe the cache, as this could do
a 64-bit shift of a 64-bit variable which is undefined behavior in C.
Instead set the related variables to zero directly.
Thanks to Uoti for pointing out the problem.
CC: libav-stable@libav.org
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/bitstream.h | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/libavcodec/bitstream.h b/libavcodec/bitstream.h index d6dd2b9..1b23cb2 100644 --- a/libavcodec/bitstream.h +++ b/libavcodec/bitstream.h @@ -239,11 +239,13 @@ static inline void skip_remaining(BitstreamContext *bc, unsigned n) /* Skip n bits in the buffer. */ static inline void bitstream_skip(BitstreamContext *bc, unsigned n) { - if (n <= bc->bits_left) + if (n < bc->bits_left) skip_remaining(bc, n); else { n -= bc->bits_left; - skip_remaining(bc, bc->bits_left); + bc->bits = 0; + bc->bits_left = 0; + if (n >= 64) { unsigned skip = n / 8; |