diff options
Diffstat (limited to 'drivers/video/fbmem.c')
| -rw-r--r-- | drivers/video/fbmem.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c index 6240aedb4154..10dfdf035264 100644 --- a/drivers/video/fbmem.c +++ b/drivers/video/fbmem.c | |||
| @@ -722,14 +722,30 @@ static void try_to_load(int fb) | |||
| 722 | int | 722 | int |
| 723 | fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var) | 723 | fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var) |
| 724 | { | 724 | { |
| 725 | struct fb_fix_screeninfo *fix = &info->fix; | ||
| 725 | int xoffset = var->xoffset; | 726 | int xoffset = var->xoffset; |
| 726 | int yoffset = var->yoffset; | 727 | int yoffset = var->yoffset; |
| 727 | int err; | 728 | int err = 0, yres = info->var.yres; |
| 729 | |||
| 730 | if (var->yoffset > 0) { | ||
| 731 | if (var->vmode & FB_VMODE_YWRAP) { | ||
| 732 | if (!fix->ywrapstep || (var->yoffset % fix->ywrapstep)) | ||
| 733 | err = -EINVAL; | ||
| 734 | else | ||
| 735 | yres = 0; | ||
| 736 | } else if (!fix->ypanstep || (var->yoffset % fix->ypanstep)) | ||
| 737 | err = -EINVAL; | ||
| 738 | } | ||
| 739 | |||
| 740 | if (var->xoffset > 0 && (!fix->xpanstep || | ||
| 741 | (var->xoffset % fix->xpanstep))) | ||
| 742 | err = -EINVAL; | ||
| 743 | |||
| 744 | if (err || !info->fbops->fb_pan_display || xoffset < 0 || | ||
| 745 | yoffset < 0 || var->yoffset + yres > info->var.yres_virtual || | ||
| 746 | var->xoffset + info->var.xres > info->var.xres_virtual) | ||
| 747 | return -EINVAL; | ||
| 728 | 748 | ||
| 729 | if (xoffset < 0 || yoffset < 0 || !info->fbops->fb_pan_display || | ||
| 730 | xoffset + info->var.xres > info->var.xres_virtual || | ||
| 731 | yoffset + info->var.yres > info->var.yres_virtual) | ||
| 732 | return -EINVAL; | ||
| 733 | if ((err = info->fbops->fb_pan_display(var, info))) | 749 | if ((err = info->fbops->fb_pan_display(var, info))) |
| 734 | return err; | 750 | return err; |
| 735 | info->var.xoffset = var->xoffset; | 751 | info->var.xoffset = var->xoffset; |
