Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/imlib2

Dir     : e17/libs/imlib2/src/modules/loaders


Modified Files:
        loader_tga.c 


Log Message:



fix possible overflow in tga loader

===================================================================
RCS file: /cvs/e/e17/libs/imlib2/src/modules/loaders/loader_tga.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- loader_tga.c        6 Sep 2006 07:09:05 -0000       1.3
+++ loader_tga.c        4 Nov 2006 17:43:44 -0000       1.4
@@ -318,7 +318,7 @@
    if (((!im->data) && (im->loader)) || (immediate_load) || (progress))
      {
         unsigned long       datasize;
-        unsigned char      *bufptr;
+        unsigned char      *bufptr, *bufend;
         DATA32             *dataptr;
 
         int                 y;
@@ -346,6 +346,7 @@
 
         /* bufptr is the next byte to be read from the buffer */
         bufptr = filedata;
+       bufend = filedata + datasize;
 
         /* dataptr is the next 32-bit pixel to be filled in */
         dataptr = im->data;
@@ -418,9 +419,10 @@
              unsigned char       curbyte, red, green, blue, alpha;
              DATA32             *final_pixel = dataptr + im->w * im->h;
 
-             /* loop until we've got all the pixels */
-             while (dataptr < final_pixel)
-               {
+             /* loop until we've got all the pixels or run out of input */
+            while ((dataptr < final_pixel) &&
+                   ((bufptr + 1 + (bpp / 8)) < bufend))
+              {
                   int                 count;
 
                   curbyte = *bufptr++;
@@ -437,7 +439,7 @@
                               green = *bufptr++;
                               red = *bufptr++;
                               alpha = *bufptr++;
-                              for (i = 0; i < count; i++)
+                           for (i = 0; (i < count) && (dataptr < final_pixel); 
i++)
                                 {
                                    WRITE_RGBA(dataptr, red, green, blue, 
alpha);
                                    dataptr++;
@@ -448,7 +450,7 @@
                               blue = *bufptr++;
                               green = *bufptr++;
                               red = *bufptr++;
-                              for (i = 0; i < count; i++)
+                           for (i = 0; (i < count) && (dataptr < final_pixel); 
i++)
                                 {
                                    WRITE_RGBA(dataptr, red, green, blue,
                                               (char)0xff);
@@ -458,7 +460,7 @@
 
                            case 8:
                               alpha = *bufptr++;
-                              for (i = 0; i < count; i++)
+                           for (i = 0; (i < count) && (dataptr < final_pixel); 
i++)
                                 {
                                    WRITE_RGBA(dataptr, alpha, alpha, alpha,
                                               (char)0xff);
@@ -473,7 +475,7 @@
                     {
                        int                 i;
 
-                       for (i = 0; i < count; i++)
+                       for (i = 0; (i < count) && (dataptr < final_pixel); i++)
                          {
                             switch (bpp)
                               {



-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to