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