tridentfb: fix pseudo_palette array overrun in setcolreg
authorAntonino A. Daplas <adaplas@gmail.com>
Tue, 17 Jul 2007 11:05:41 +0000 (04:05 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Tue, 17 Jul 2007 17:23:12 +0000 (10:23 -0700)
The pseudo_palette has only 16 elements. Do not write if regno (the array
index) is more than 15.

Signed-off-by: Antonino Daplas <adaplas@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/video/tridentfb.c

index 55e8aa450bfa36e2760ed5557610386c9654000a..c699864b6f4af1707efd1a3a2976b39f9b4a0a92 100644 (file)
@@ -976,7 +976,7 @@ static int tridentfb_setcolreg(unsigned regno, unsigned red, unsigned green,
                return 1;
 
 
-       if (bpp==8) {
+       if (bpp == 8) {
                t_outb(0xFF,0x3C6);
                t_outb(regno,0x3C8);
 
@@ -984,19 +984,21 @@ static int tridentfb_setcolreg(unsigned regno, unsigned red, unsigned green,
                t_outb(green>>10,0x3C9);
                t_outb(blue>>10,0x3C9);
 
-       } else if (bpp == 16) { /* RGB 565 */
-               u32 col;
-
-               col = (red & 0xF800) | ((green & 0xFC00) >> 5) |
-                       ((blue & 0xF800) >> 11);
-               col |= col << 16;       
-               ((u32 *)(info->pseudo_palette))[regno] = col;
-       } else if (bpp == 32)           /* ARGB 8888 */
-               ((u32*)info->pseudo_palette)[regno] =
-                       ((transp & 0xFF00) <<16)        |
-                       ((red & 0xFF00) << 8)           |
-                       ((green & 0xFF00))              |
-                       ((blue & 0xFF00)>>8);
+       } else if (regno < 16) {
+               if (bpp == 16) {        /* RGB 565 */
+                       u32 col;
+
+                       col = (red & 0xF800) | ((green & 0xFC00) >> 5) |
+                               ((blue & 0xF800) >> 11);
+                       col |= col << 16;
+                       ((u32 *)(info->pseudo_palette))[regno] = col;
+               } else if (bpp == 32)           /* ARGB 8888 */
+                       ((u32*)info->pseudo_palette)[regno] =
+                               ((transp & 0xFF00) <<16)        |
+                               ((red & 0xFF00) << 8)           |
+                               ((green & 0xFF00))              |
+                               ((blue & 0xFF00)>>8);
+       }
 
 //     debug("exit\n");
        return 0;