diff options
author | Antonino A. Daplas <adaplas@gmail.com> | 2007-07-17 07:05:41 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-17 13:23:12 -0400 |
commit | 973d9ab231a6b9feb1ff5b9a072f11756eca96cc (patch) | |
tree | fefef9f4bd86989579a8b6496dfc09faba19acf8 /drivers/video/tridentfb.c | |
parent | eb3daa83c2f63743fb7597f620beac75e1ba5633 (diff) |
tridentfb: fix pseudo_palette array overrun in setcolreg
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>
Diffstat (limited to 'drivers/video/tridentfb.c')
-rw-r--r-- | drivers/video/tridentfb.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/drivers/video/tridentfb.c b/drivers/video/tridentfb.c index 55e8aa450bfa..c699864b6f4a 100644 --- a/drivers/video/tridentfb.c +++ b/drivers/video/tridentfb.c | |||
@@ -976,7 +976,7 @@ static int tridentfb_setcolreg(unsigned regno, unsigned red, unsigned green, | |||
976 | return 1; | 976 | return 1; |
977 | 977 | ||
978 | 978 | ||
979 | if (bpp==8) { | 979 | if (bpp == 8) { |
980 | t_outb(0xFF,0x3C6); | 980 | t_outb(0xFF,0x3C6); |
981 | t_outb(regno,0x3C8); | 981 | t_outb(regno,0x3C8); |
982 | 982 | ||
@@ -984,19 +984,21 @@ static int tridentfb_setcolreg(unsigned regno, unsigned red, unsigned green, | |||
984 | t_outb(green>>10,0x3C9); | 984 | t_outb(green>>10,0x3C9); |
985 | t_outb(blue>>10,0x3C9); | 985 | t_outb(blue>>10,0x3C9); |
986 | 986 | ||
987 | } else if (bpp == 16) { /* RGB 565 */ | 987 | } else if (regno < 16) { |
988 | u32 col; | 988 | if (bpp == 16) { /* RGB 565 */ |
989 | 989 | u32 col; | |
990 | col = (red & 0xF800) | ((green & 0xFC00) >> 5) | | 990 | |
991 | ((blue & 0xF800) >> 11); | 991 | col = (red & 0xF800) | ((green & 0xFC00) >> 5) | |
992 | col |= col << 16; | 992 | ((blue & 0xF800) >> 11); |
993 | ((u32 *)(info->pseudo_palette))[regno] = col; | 993 | col |= col << 16; |
994 | } else if (bpp == 32) /* ARGB 8888 */ | 994 | ((u32 *)(info->pseudo_palette))[regno] = col; |
995 | ((u32*)info->pseudo_palette)[regno] = | 995 | } else if (bpp == 32) /* ARGB 8888 */ |
996 | ((transp & 0xFF00) <<16) | | 996 | ((u32*)info->pseudo_palette)[regno] = |
997 | ((red & 0xFF00) << 8) | | 997 | ((transp & 0xFF00) <<16) | |
998 | ((green & 0xFF00)) | | 998 | ((red & 0xFF00) << 8) | |
999 | ((blue & 0xFF00)>>8); | 999 | ((green & 0xFF00)) | |
1000 | ((blue & 0xFF00)>>8); | ||
1001 | } | ||
1000 | 1002 | ||
1001 | // debug("exit\n"); | 1003 | // debug("exit\n"); |
1002 | return 0; | 1004 | return 0; |