Commit 9578e52e authored by Florian Tobias Schandinat's avatar Florian Tobias Schandinat Committed by Greg Kroah-Hartman

viafb: improve pitch handling

commit 936a3f77 upstream.

This patch adds checks for minimum and maximum pitch size to prevent
invalid settings which could otherwise crash the machine. Also the
alignment is done in a slightly more readable way.
Signed-off-by: default avatarFlorian Tobias Schandinat <FlorianSchandinat@gmx.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 51bbfa9e
...@@ -28,6 +28,11 @@ ...@@ -28,6 +28,11 @@
#include <linux/types.h> #include <linux/types.h>
#define VIA_PITCH_SIZE (1<<3)
#define VIA_PITCH_MAX 0x3FF8
void via_set_primary_address(u32 addr); void via_set_primary_address(u32 addr);
void via_set_secondary_address(u32 addr); void via_set_secondary_address(u32 addr);
void via_set_primary_pitch(u32 pitch); void via_set_primary_pitch(u32 pitch);
......
...@@ -151,7 +151,8 @@ static void viafb_update_fix(struct fb_info *info) ...@@ -151,7 +151,8 @@ static void viafb_update_fix(struct fb_info *info)
info->fix.visual = info->fix.visual =
bpp == 8 ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR; bpp == 8 ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR;
info->fix.line_length = (info->var.xres_virtual * bpp / 8 + 7) & ~7; info->fix.line_length = ALIGN(info->var.xres_virtual * bpp / 8,
VIA_PITCH_SIZE);
} }
static void viafb_setup_fixinfo(struct fb_fix_screeninfo *fix, static void viafb_setup_fixinfo(struct fb_fix_screeninfo *fix,
...@@ -238,8 +239,12 @@ static int viafb_check_var(struct fb_var_screeninfo *var, ...@@ -238,8 +239,12 @@ static int viafb_check_var(struct fb_var_screeninfo *var,
depth = 24; depth = 24;
viafb_fill_var_color_info(var, depth); viafb_fill_var_color_info(var, depth);
line = (var->xres_virtual * var->bits_per_pixel / 8 + 7) & ~7; if (var->xres_virtual < var->xres)
if (line * var->yres_virtual > ppar->memsize) var->xres_virtual = var->xres;
line = ALIGN(var->xres_virtual * var->bits_per_pixel / 8,
VIA_PITCH_SIZE);
if (line > VIA_PITCH_MAX || line * var->yres_virtual > ppar->memsize)
return -EINVAL; return -EINVAL;
/* Based on var passed in to calculate the refresh, /* Based on var passed in to calculate the refresh,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment