From 76706563229f13370be2265d31fa853e75bdbc2e Mon Sep 17 00:00:00 2001 From: Sean Barrett <sean2@nothings.org> Date: Thu, 3 Sep 2015 10:24:01 -0700 Subject: [PATCH] fix some signed shifts that should have been unsigned for C spec reasons --- stb_vorbis.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/stb_vorbis.c b/stb_vorbis.c index 57cb825..07385e6 100644 --- a/stb_vorbis.c +++ b/stb_vorbis.c @@ -36,6 +36,8 @@ // // Partial history: // 1.06 - 2015/08/31 - full, correct support for seeking API (Dougall Johnson) +// some crash fixes when out of memory or with corrupt files +// fix some inappropriately signed shifts // 1.05 - 2015/04/19 - don't define __forceinline if it's redundant // 1.04 - 2014/08/27 - fix missing const-correct case in API // 1.03 - 2014/08/07 - warning fixes @@ -934,7 +936,7 @@ static void crc32_init(void) int i,j; uint32 s; for(i=0; i < 256; i++) { - for (s=i<<24, j=0; j < 8; ++j) + for (s=(uint32) i << 24, j=0; j < 8; ++j) s = (s << 1) ^ (s >= (1U<<31) ? CRC32_POLY : 0); crc_table[i] = s; } @@ -1035,7 +1037,7 @@ static int compute_codewords(Codebook *c, uint8 *len, int n, uint32 *values) add_entry(c, 0, k, m++, len[k], values); // add all available leaves for (i=1; i <= len[k]; ++i) - available[i] = 1 << (32-i); + available[i] = 1U << (32-i); // note that the above code treats the first case specially, // but it's really the same as the following code, so they // could probably be combined (except the initial code is 0, @@ -1564,7 +1566,7 @@ static __forceinline void prep_huffman(vorb *f) if (f->last_seg && !f->bytes_in_seg) return; z = get8_packet_raw(f); if (z == EOP) return; - f->acc += z << f->valid_bits; + f->acc += (unsigned) z << f->valid_bits; f->valid_bits += 8; } while (f->valid_bits <= 24); } @@ -5383,6 +5385,8 @@ int stb_vorbis_get_samples_float(stb_vorbis *f, int channels, float **buffer, in #endif // STB_VORBIS_NO_PULLDATA_API /* Version history + 1.06 - 2015/08/31 - full, correct support for seeking API (Dougall Johnson) + some crash fixes when out of memory or with corrupt files 1.05 - 2015/04/19 - don't define __forceinline if it's redundant 1.04 - 2014/08/27 - fix missing const-correct case in API 1.03 - 2014/08/07 - Warning fixes