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>
This commit is contained in:
parent
eb3daa83c2
commit
973d9ab231
1 changed files with 15 additions and 13 deletions
|
@ -976,7 +976,7 @@ static int tridentfb_setcolreg(unsigned regno, unsigned red, unsigned green,
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
|
||||||
if (bpp==8) {
|
if (bpp == 8) {
|
||||||
t_outb(0xFF,0x3C6);
|
t_outb(0xFF,0x3C6);
|
||||||
t_outb(regno,0x3C8);
|
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(green>>10,0x3C9);
|
||||||
t_outb(blue>>10,0x3C9);
|
t_outb(blue>>10,0x3C9);
|
||||||
|
|
||||||
} else if (bpp == 16) { /* RGB 565 */
|
} else if (regno < 16) {
|
||||||
u32 col;
|
if (bpp == 16) { /* RGB 565 */
|
||||||
|
u32 col;
|
||||||
|
|
||||||
col = (red & 0xF800) | ((green & 0xFC00) >> 5) |
|
col = (red & 0xF800) | ((green & 0xFC00) >> 5) |
|
||||||
((blue & 0xF800) >> 11);
|
((blue & 0xF800) >> 11);
|
||||||
col |= col << 16;
|
col |= col << 16;
|
||||||
((u32 *)(info->pseudo_palette))[regno] = col;
|
((u32 *)(info->pseudo_palette))[regno] = col;
|
||||||
} else if (bpp == 32) /* ARGB 8888 */
|
} else if (bpp == 32) /* ARGB 8888 */
|
||||||
((u32*)info->pseudo_palette)[regno] =
|
((u32*)info->pseudo_palette)[regno] =
|
||||||
((transp & 0xFF00) <<16) |
|
((transp & 0xFF00) <<16) |
|
||||||
((red & 0xFF00) << 8) |
|
((red & 0xFF00) << 8) |
|
||||||
((green & 0xFF00)) |
|
((green & 0xFF00)) |
|
||||||
((blue & 0xFF00)>>8);
|
((blue & 0xFF00)>>8);
|
||||||
|
}
|
||||||
|
|
||||||
// debug("exit\n");
|
// debug("exit\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Reference in a new issue