summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Barbato <lu_zero@gentoo.org>2017-07-08 21:04:44 +0200
committerLuca Barbato <lu_zero@gentoo.org>2017-07-09 12:56:15 +0200
commit79f64f7ebc2b2b7030c6219914bc141cc03fd377 (patch)
treed14d3329e4ff78b6ffedcca63ee0444ef8256e7d
parentfd92dafaff8844b5fedf94679b93d953939a7f7b (diff)
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
-rw-r--r--libavcodec/bitstream.h6
1 files changed, 4 insertions, 2 deletions
diff --git a/libavcodec/bitstream.h b/libavcodec/bitstream.h
index d6dd2b9411..1b23cb2fa7 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;