diff lzw.c @ 4733:507d08212e36 libavcodec

check input validity, this prevents a few variables from reachin odd values which might have lead to out of array writes and thus might have been exploitable
author michael
date Sun, 25 Mar 2007 23:37:38 +0000
parents 8583aa3c21bc
children 8903c1d6db18
line wrap: on
line diff
--- a/lzw.c	Sun Mar 25 23:22:11 2007 +0000
+++ b/lzw.c	Sun Mar 25 23:37:38 2007 +0000
@@ -196,7 +196,6 @@
         }
         c = lzw_get_code(s);
         if (c == s->end_code) {
-            s->end_code = -1;
             break;
         } else if (c == s->clear_code) {
             s->cursize = s->codesize + 1;
@@ -206,10 +205,11 @@
             fc= oc= -1;
         } else {
             code = c;
-            if (code >= s->slot) {
+            if (code == s->slot && fc>=0) {
                 *sp++ = fc;
                 code = oc;
-            }
+            }else if(code >= s->slot)
+                break;
             while (code >= s->newcodes) {
                 *sp++ = s->suffix[code];
                 code = s->prefix[code];
@@ -229,6 +229,7 @@
             }
         }
     }
+    s->end_code = -1;
   the_end:
     s->sp = sp;
     s->oc = oc;