Browse Source

fix some signed shifts that should have been unsigned for C spec reasons

Sean Barrett 10 years ago
parent
commit
7670656322
1 changed files with 7 additions and 3 deletions
  1. 7 3
      stb_vorbis.c

+ 7 - 3
stb_vorbis.c

@@ -36,6 +36,8 @@
 //
 //
 // Partial history:
 // Partial history:
 //    1.06    - 2015/08/31 - full, correct support for seeking API (Dougall Johnson)
 //    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.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.04    - 2014/08/27 - fix missing const-correct case in API
 //    1.03    - 2014/08/07 - warning fixes
 //    1.03    - 2014/08/07 - warning fixes
@@ -934,7 +936,7 @@ static void crc32_init(void)
    int i,j;
    int i,j;
    uint32 s;
    uint32 s;
    for(i=0; i < 256; i++) {
    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);
          s = (s << 1) ^ (s >= (1U<<31) ? CRC32_POLY : 0);
       crc_table[i] = s;
       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_entry(c, 0, k, m++, len[k], values);
    // add all available leaves
    // add all available leaves
    for (i=1; i <= len[k]; ++i)
    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,
    // note that the above code treats the first case specially,
    // but it's really the same as the following code, so they
    // but it's really the same as the following code, so they
    // could probably be combined (except the initial code is 0,
    // 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;
          if (f->last_seg && !f->bytes_in_seg) return;
          z = get8_packet_raw(f);
          z = get8_packet_raw(f);
          if (z == EOP) return;
          if (z == EOP) return;
-         f->acc += z << f->valid_bits;
+         f->acc += (unsigned) z << f->valid_bits;
          f->valid_bits += 8;
          f->valid_bits += 8;
       } while (f->valid_bits <= 24);
       } 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
 #endif // STB_VORBIS_NO_PULLDATA_API
 
 
 /* Version history
 /* 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.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.04    - 2014/08/27 - fix missing const-correct case in API
     1.03    - 2014/08/07 - Warning fixes
     1.03    - 2014/08/07 - Warning fixes