From 60a030e4b6c85c0e52acf699189ae29b3873e89b Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sat, 28 Jan 2017 18:02:33 +0100 Subject: [PATCH] wmadec: Use read_u32_be(). The shift operation in show_bits() was buggy because p[0] is promoted to int, and the shift p[0] << 24 results in undefined behavior, causing the sanitizer of gcc to complain: bitstream.h:40:21: runtime error: left shift of 230 by 24 places cannot be represented in type 'int' read_u32_be() gets this right. --- bitstream.c | 1 + bitstream.h | 4 ++-- wmadec_filter.c | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/bitstream.c b/bitstream.c index 638d19a3..9cd1273c 100644 --- a/bitstream.c +++ b/bitstream.c @@ -19,6 +19,7 @@ #include "error.h" #include "string.h" #include "wma.h" +#include "portable_io.h" #include "bitstream.h" static inline uint32_t get_data(const void *table, int i, int size) diff --git a/bitstream.h b/bitstream.h index 5875b0d0..a6349861 100644 --- a/bitstream.h +++ b/bitstream.h @@ -36,8 +36,8 @@ struct vlc { static inline uint32_t show_bits(struct getbit_context *gbc, int num) { int idx = gbc->index; - const uint8_t *p = gbc->buffer + (idx >> 3); - uint32_t x = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; + const char *p = (const char *)gbc->buffer + (idx >> 3); + uint32_t x = read_u32_be(p); return (x << (idx & 7)) >> (32 - num); } diff --git a/wmadec_filter.c b/wmadec_filter.c index 4c7c047a..692ea0f3 100644 --- a/wmadec_filter.c +++ b/wmadec_filter.c @@ -29,6 +29,7 @@ #include "sched.h" #include "buffer_tree.h" #include "filter.h" +#include "portable_io.h" #include "bitstream.h" #include "imdct.h" #include "wma.h" -- 2.39.5