Avoid negative shifts in build_table()
authorMåns Rullgård <mans@mansr.com>
Sun, 21 Feb 2010 15:11:57 +0000 (15:11 +0000)
committerMåns Rullgård <mans@mansr.com>
Sun, 21 Feb 2010 15:11:57 +0000 (15:11 +0000)
A shift by a negative amount has undefined behaviour.  Even though
the result of this shift is never used, the shift itself could
cause an exception of some kind.

Originally committed as revision 21939 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/bitstream.c

index 9002830..7549e7d 100644 (file)
@@ -158,11 +158,12 @@ static int build_table(VLC *vlc, int table_nb_bits,
 #endif
         /* if code matches the prefix, it is in the table */
         n -= n_prefix;
+        if (n > 0) {
         if(flags & INIT_VLC_LE)
             code_prefix2= code & (n_prefix>=32 ? 0xffffffff : (1 << n_prefix)-1);
         else
             code_prefix2= code >> n;
-        if (n > 0 && code_prefix2 == code_prefix) {
+        if (code_prefix2 == code_prefix) {
             if (n <= table_nb_bits) {
                 /* no need to add another table */
                 j = (code << (table_nb_bits - n)) & (table_size - 1);
@@ -196,6 +197,7 @@ static int build_table(VLC *vlc, int table_nb_bits,
                 table[j][1] = -n1; //bits
             }
         }
+        }
     }
 
     /* second pass : fill auxillary tables recursively */