Skip to contentSkip to conversation

fbdev: Pan display fixes

PATCH In review Antonino A. Daplas 2 participants 3 messages Dec 10, 2005 Framebuffer layer

lore
Share & tools
lore
#0 lore raw

PATCH 2/18 fbdev: Pan display fixes

- Fix fb_pan_display rejecting yoffsets that are valid if panning mode is ywrap.
- Add more robust error checking in fb_pan_display specially since this function is accessible by userland apps.

---

 drivers/video/fbmem.c |   26 +++++++++++++++++++++-----
 1 files changed, 21 insertions(+), 5 deletions(-)
drivers/video/fbmem.c +21 -5
index 6240aed..10dfdf0 100644
@@ -722,14 +722,30 @@ static void try_to_load(int fb)
 int
 fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var)
 {
+	struct fb_fix_screeninfo *fix = &info->fix;
         int xoffset = var->xoffset;
         int yoffset = var->yoffset;
-        int err;
+        int err = 0, yres = info->var.yres;
+
+	if (var->yoffset > 0) {
+		if (var->vmode & FB_VMODE_YWRAP) {
+			if (!fix->ywrapstep || (var->yoffset % fix->ywrapstep))
+				err = -EINVAL;
+			else
+				yres = 0;
+		} else if (!fix->ypanstep || (var->yoffset % fix->ypanstep))
+			err = -EINVAL;
+	}
+
+	if (var->xoffset > 0 && (!fix->xpanstep ||
+				 (var->xoffset % fix->xpanstep)))
+		err = -EINVAL;
+
+        if (err || !info->fbops->fb_pan_display || xoffset < 0 ||
+	    yoffset < 0 || var->yoffset + yres > info->var.yres_virtual ||
+	    var->xoffset + info->var.xres > info->var.xres_virtual)
+		return -EINVAL;
 
-        if (xoffset < 0 || yoffset < 0 || !info->fbops->fb_pan_display ||
-            xoffset + info->var.xres > info->var.xres_virtual ||
-            yoffset + info->var.yres > info->var.yres_virtual)
-                return -EINVAL;
 	if ((err = info->fbops->fb_pan_display(var, info)))
 		return err;
         info->var.xoffset = var->xoffset;

-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click

#1 lore raw
Quoted 5 lines · Antonino A. Daplas

@@ -722,14 +722,30 @@ static void try_to_load(int fb)
int
fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var) {

Quoted 7 lines
 +	struct fb_fix_screeninfo *fix = &info->fix;
          int xoffset = var->xoffset;
          int yoffset = var->yoffset;

- int err;
+ int err = 0, yres = info->var.yres;
+
+ if (var->yoffset > 0) {

Something horrid has happened to your whitespace.

-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click

#2 lore raw
Quoted 13 lines · Andrew Morton
Quoted 11 lines · Antonino A. Daplas

@@ -722,14 +722,30 @@ static void try_to_load(int fb)
int
fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var) {

 +	struct fb_fix_screeninfo *fix = &info->fix;
          int xoffset = var->xoffset;
          int yoffset = var->yoffset;

- int err;
+ int err = 0, yres = info->var.yres;
+
+ if (var->yoffset > 0) {

Quoted 2 lines

Something horrid has happened to your whitespace.

It's the original that is using spaces instead of tabs. I did not notice it though until you mentioned it.

Tony

-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click