aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2011-05-25 05:34:52 -0400
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2011-08-19 04:36:27 -0400
commit0d5c6ca30bb0190c0a63fd6452c71051fb6bfbe4 (patch)
tree984b7f5a411bb7222754a2d5aae4280812d4a9a0
parent10a6c1de2ca2761f87c9bd62ab882577a80995f1 (diff)
staging: xgifb: use display information in info not in var for panning
We must not use any information in the passed var besides xoffset, yoffset and vmode as otherwise applications might abuse it. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--drivers/staging/xgifb/XGI_main_26.c22
1 files changed, 6 insertions, 16 deletions
diff --git a/drivers/staging/xgifb/XGI_main_26.c b/drivers/staging/xgifb/XGI_main_26.c
index 4403e5f8059..f8b88add952 100644
--- a/drivers/staging/xgifb/XGI_main_26.c
+++ b/drivers/staging/xgifb/XGI_main_26.c
@@ -1364,26 +1364,16 @@ static int XGIfb_do_set_var(struct fb_var_screeninfo *var, int isactive,
1364} 1364}
1365 1365
1366#ifdef XGIFB_PAN 1366#ifdef XGIFB_PAN
1367static int XGIfb_pan_var(struct fb_var_screeninfo *var) 1367static int XGIfb_pan_var(struct fb_var_screeninfo *var, struct fb_info *info)
1368{ 1368{
1369 unsigned int base; 1369 unsigned int base;
1370 1370
1371 /* printk("Inside pan_var"); */ 1371 /* printk("Inside pan_var"); */
1372 1372
1373 if (var->xoffset > (var->xres_virtual - var->xres)) { 1373 base = var->yoffset * info->var.xres_virtual + var->xoffset;
1374 /* printk("Pan: xo: %d xv %d xr %d\n",
1375 var->xoffset, var->xres_virtual, var->xres); */
1376 return -EINVAL;
1377 }
1378 if (var->yoffset > (var->yres_virtual - var->yres)) {
1379 /* printk("Pan: yo: %d yv %d yr %d\n",
1380 var->yoffset, var->yres_virtual, var->yres); */
1381 return -EINVAL;
1382 }
1383 base = var->yoffset * var->xres_virtual + var->xoffset;
1384 1374
1385 /* calculate base bpp dep. */ 1375 /* calculate base bpp dep. */
1386 switch (var->bits_per_pixel) { 1376 switch (info->var.bits_per_pixel) {
1387 case 16: 1377 case 16:
1388 base >>= 1; 1378 base >>= 1;
1389 break; 1379 break;
@@ -1681,9 +1671,9 @@ static int XGIfb_pan_display(struct fb_var_screeninfo *var,
1681 1671
1682 /* printk("\nInside pan_display:\n"); */ 1672 /* printk("\nInside pan_display:\n"); */
1683 1673
1684 if (var->xoffset > (var->xres_virtual - var->xres)) 1674 if (var->xoffset > (info->var.xres_virtual - info->var.xres))
1685 return -EINVAL; 1675 return -EINVAL;
1686 if (var->yoffset > (var->yres_virtual - var->yres)) 1676 if (var->yoffset > (info->var.yres_virtual - info->var.yres))
1687 return -EINVAL; 1677 return -EINVAL;
1688 1678
1689 if (var->vmode & FB_VMODE_YWRAP) { 1679 if (var->vmode & FB_VMODE_YWRAP) {
@@ -1696,7 +1686,7 @@ static int XGIfb_pan_display(struct fb_var_screeninfo *var,
1696 > info->var.yres_virtual) 1686 > info->var.yres_virtual)
1697 return -EINVAL; 1687 return -EINVAL;
1698 } 1688 }
1699 err = XGIfb_pan_var(var); 1689 err = XGIfb_pan_var(var, info);
1700 if (err < 0) 1690 if (err < 0)
1701 return err; 1691 return err;
1702 1692