patch-2.4.0-test3 linux/drivers/video/fbmem.c
Next file: linux/drivers/video/igafb.c
Previous file: linux/drivers/video/clgenfb.c
Back to the patch index
Back to the overall index
- Lines: 86
- Date:
Thu Jun 29 18:25:51 2000
- Orig file:
v2.4.0-test2/linux/drivers/video/fbmem.c
- Orig date:
Fri Jun 23 21:55:10 2000
diff -u --recursive --new-file v2.4.0-test2/linux/drivers/video/fbmem.c linux/drivers/video/fbmem.c
@@ -292,19 +292,27 @@
struct fb_info *info = registered_fb[fbidx];
struct fb_ops *fb = info->fbops;
struct fb_fix_screeninfo fix;
- char *base_addr;
- ssize_t copy_size;
if (! fb || ! info->disp)
return -ENODEV;
fb->fb_get_fix(&fix,PROC_CONSOLE(info), info);
- base_addr=info->disp->screen_base;
- copy_size=(count + p <= fix.smem_len ? count : fix.smem_len - p);
- if (copy_to_user(buf, base_addr+p, copy_size))
- return -EFAULT;
- *ppos += copy_size;
- return copy_size;
+ if (p >= fix.smem_len)
+ return 0;
+ if (count >= fix.smem_len)
+ count = fix.smem_len;
+ if (count + p > fix.smem_len)
+ count = fix.smem_len - p;
+ if (count) {
+ char *base_addr;
+
+ base_addr = info->disp->screen_base;
+ count -= copy_to_user(buf, base_addr+p, count);
+ if (!count)
+ return -EFAULT;
+ *ppos += count;
+ }
+ return count;
}
static ssize_t
@@ -316,19 +324,32 @@
struct fb_info *info = registered_fb[fbidx];
struct fb_ops *fb = info->fbops;
struct fb_fix_screeninfo fix;
- char *base_addr;
- ssize_t copy_size;
+ int err;
if (! fb || ! info->disp)
return -ENODEV;
fb->fb_get_fix(&fix, PROC_CONSOLE(info), info);
- base_addr=info->disp->screen_base;
- copy_size=(count + p <= fix.smem_len ? count : fix.smem_len - p);
- if (copy_from_user(base_addr+p, buf, copy_size))
- return -EFAULT;
- file->f_pos += copy_size;
- return copy_size;
+ if (p > fix.smem_len)
+ return -ENOSPC;
+ if (count >= fix.smem_len)
+ count = fix.smem_len;
+ err = 0;
+ if (count + p > fix.smem_len) {
+ count = fix.smem_len - p;
+ err = -ENOSPC;
+ }
+ if (count) {
+ char *base_addr;
+
+ base_addr = info->disp->screen_base;
+ count -= copy_from_user(base_addr+p, buf, count);
+ *ppos += count;
+ err = -EFAULT;
+ }
+ if (count)
+ return count;
+ return err;
}
#ifdef CONFIG_KMOD
@@ -688,7 +709,7 @@
create_proc_read_entry("fb", 0, 0, fbmem_read_proc, NULL);
- devfs_handle = devfs_mk_dir (NULL, "fb", 0, NULL);
+ devfs_handle = devfs_mk_dir (NULL, "fb", NULL);
if (devfs_register_chrdev(FB_MAJOR,"fb",&fb_fops))
printk("unable to get major %d for fb devs\n", FB_MAJOR);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)