From: Andre Noll Date: Sat, 28 Jan 2017 17:02:33 +0000 (+0100) Subject: wmadec: Use read_u32_be(). X-Git-Tag: v0.6.0~8^2 X-Git-Url: http://git.tue.mpg.de/?a=commitdiff_plain;h=60a030e4b6c85c0e52acf699189ae29b3873e89b;p=paraslash.git 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. --- 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"