On 7/8/17 11:48 PM, Luca Barbato wrote:
> Do not use skip_remaining to fully wipe the cache.
> Thanks to Uoti for pointing out the problem.
> 
> CC: libav-sta...@libav.org
> ---
>  libavcodec/bitstream.h | 6 ++++--
>  1 file 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;
>  
> 

Uoti suggested:

    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-sta...@libav.org
_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to