aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/pvr2fb.c
diff options
context:
space:
mode:
authorAntonino A. Daplas <adaplas@gmail.com>2007-07-17 07:05:39 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-17 13:23:12 -0400
commita66ad56eb2c9644717da4d7f05f971d6786145e3 (patch)
treef4cb903d8f7174c727d0b4e64331cb9b1f1a65f8 /drivers/video/pvr2fb.c
parent02c2c209c26ca452b2e688cdb0cb6bb4bc7cdf7f (diff)
pvr2fb: fix pseudo_palette array overrun and typecast
- the pseudo_palette has only 16 elements. Do not write if regno (the array index) is more than 15. - if using generic drawing libraries, the typecast of pseudo_palette is always u32 * Signed-off-by: Antonino Daplas <adaplas@gmail.com> Acked-by: Paul Mundt <lethal@linux-sh.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/video/pvr2fb.c')
-rw-r--r--drivers/video/pvr2fb.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/video/pvr2fb.c b/drivers/video/pvr2fb.c
index 2ba959a83eb0..0f88c30f94f8 100644
--- a/drivers/video/pvr2fb.c
+++ b/drivers/video/pvr2fb.c
@@ -333,24 +333,25 @@ static int pvr2fb_setcolreg(unsigned int regno, unsigned int red,
333 ((blue & 0xf800) >> 11); 333 ((blue & 0xf800) >> 11);
334 334
335 pvr2fb_set_pal_entry(par, regno, tmp); 335 pvr2fb_set_pal_entry(par, regno, tmp);
336 ((u16*)(info->pseudo_palette))[regno] = tmp;
337 break; 336 break;
338 case 24: /* RGB 888 */ 337 case 24: /* RGB 888 */
339 red >>= 8; green >>= 8; blue >>= 8; 338 red >>= 8; green >>= 8; blue >>= 8;
340 ((u32*)(info->pseudo_palette))[regno] = (red << 16) | (green << 8) | blue; 339 tmp = (red << 16) | (green << 8) | blue;
341 break; 340 break;
342 case 32: /* ARGB 8888 */ 341 case 32: /* ARGB 8888 */
343 red >>= 8; green >>= 8; blue >>= 8; 342 red >>= 8; green >>= 8; blue >>= 8;
344 tmp = (transp << 24) | (red << 16) | (green << 8) | blue; 343 tmp = (transp << 24) | (red << 16) | (green << 8) | blue;
345 344
346 pvr2fb_set_pal_entry(par, regno, tmp); 345 pvr2fb_set_pal_entry(par, regno, tmp);
347 ((u32*)(info->pseudo_palette))[regno] = tmp;
348 break; 346 break;
349 default: 347 default:
350 pr_debug("Invalid bit depth %d?!?\n", info->var.bits_per_pixel); 348 pr_debug("Invalid bit depth %d?!?\n", info->var.bits_per_pixel);
351 return 1; 349 return 1;
352 } 350 }
353 351
352 if (regno < 16)
353 ((u32*)(info->pseudo_palette))[regno] = tmp;
354
354 return 0; 355 return 0;
355} 356}
356 357