fb: fix fb_pan_display range check
authorFlorian Tobias Schandinat <FlorianSchandinat@gmx.de>
Tue, 22 Sep 2009 23:47:41 +0000 (16:47 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 23 Sep 2009 14:39:56 +0000 (07:39 -0700)
Fix the range check for panning.  The current code fails to detect some
invalid values (very high ones that can occur if an app tries to move
further up/left than 0,0) as the check uses the unknown values for
calculation so that an overflow can occur.

To fix this it is sufficient to move the calculation to the right side to
use only trusted values.

Kai Jiang detected this problem and proposed an initial patch.

Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
Cc: Kai Jiang <b18973@freescale.com>
Cc: Krzysztof Helt <krzysztof.h1@poczta.fm>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/video/fbmem.c

index a85c818be9453ecbdf11310b8a77f41435652000..346f257215a7f551367f77a0cb75965755446560 100644 (file)
@@ -871,8 +871,8 @@ fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var)
                err = -EINVAL;
 
        if (err || !info->fbops->fb_pan_display ||
-           var->yoffset + yres > info->var.yres_virtual ||
-           var->xoffset + info->var.xres > info->var.xres_virtual)
+           var->yoffset > info->var.yres_virtual - yres ||
+           var->xoffset > info->var.xres_virtual - info->var.xres)
                return -EINVAL;
 
        if ((err = info->fbops->fb_pan_display(var, info)))