Re: [4/6] fbdev: Validate info->screen_{base, buffer} in fb_ops implementations

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Tested-by: Sui Jingfeng <suijingfeng@xxxxxxxxxxx>

On 2023/4/25 22:28, Thomas Zimmermann wrote:
Push the test for info->screen_base from fb_read() and fb_write() into
the implementations of struct fb_ops.{fb_read,fb_write}. In cases where
the driver operates on info->screen_buffer, test this field instead.

Signed-off-by: Thomas Zimmermann <tzimmermann@xxxxxxx>
Reviewed-by: Javier Martinez Canillas <javierm@xxxxxxxxxx>
---
  drivers/video/fbdev/cobalt_lcdfb.c     |  6 ++++++
  drivers/video/fbdev/core/fb_sys_fops.c |  6 ++++++
  drivers/video/fbdev/core/fbmem.c       | 10 ++++++++--
  drivers/video/fbdev/sm712fb.c          |  4 ++--
  4 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/drivers/video/fbdev/cobalt_lcdfb.c b/drivers/video/fbdev/cobalt_lcdfb.c
index 5f8b6324d2e8..26dbd1c78195 100644
--- a/drivers/video/fbdev/cobalt_lcdfb.c
+++ b/drivers/video/fbdev/cobalt_lcdfb.c
@@ -129,6 +129,9 @@ static ssize_t cobalt_lcdfb_read(struct fb_info *info, char __user *buf,
  	unsigned long pos;
  	int len, retval = 0;
+ if (!info->screen_base)
+		return -ENODEV;
+
  	pos = *ppos;
  	if (pos >= LCD_CHARS_MAX || count == 0)
  		return 0;
@@ -175,6 +178,9 @@ static ssize_t cobalt_lcdfb_write(struct fb_info *info, const char __user *buf,
  	unsigned long pos;
  	int len, retval = 0;
+ if (!info->screen_base)
+		return -ENODEV;
+
  	pos = *ppos;
  	if (pos >= LCD_CHARS_MAX || count == 0)
  		return 0;
diff --git a/drivers/video/fbdev/core/fb_sys_fops.c b/drivers/video/fbdev/core/fb_sys_fops.c
index 7dee5d3c7fb1..0cb0989abda6 100644
--- a/drivers/video/fbdev/core/fb_sys_fops.c
+++ b/drivers/video/fbdev/core/fb_sys_fops.c
@@ -22,6 +22,9 @@ ssize_t fb_sys_read(struct fb_info *info, char __user *buf, size_t count,
  	unsigned long total_size, c;
  	ssize_t ret;
+ if (!info->screen_buffer)
+		return -ENODEV;
+
  	total_size = info->screen_size;
if (total_size == 0)
@@ -61,6 +64,9 @@ ssize_t fb_sys_write(struct fb_info *info, const char __user *buf,
  	unsigned long total_size, c;
  	size_t ret;
+ if (!info->screen_buffer)
+		return -ENODEV;
+
  	total_size = info->screen_size;
if (total_size == 0)
diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
index abc92d79a295..b993bb97058f 100644
--- a/drivers/video/fbdev/core/fbmem.c
+++ b/drivers/video/fbdev/core/fbmem.c
@@ -768,7 +768,7 @@ fb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
  	int c, cnt = 0, err = 0;
  	unsigned long total_size;
- if (!info || ! info->screen_base)
+	if (!info)
  		return -ENODEV;
if (info->state != FBINFO_STATE_RUNNING)
@@ -777,6 +777,9 @@ fb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
  	if (info->fbops->fb_read)
  		return info->fbops->fb_read(info, buf, count, ppos);
+ if (!info->screen_base)
+		return -ENODEV;
+
  	total_size = info->screen_size;
if (total_size == 0)
@@ -833,7 +836,7 @@ fb_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
  	int c, cnt = 0, err = 0;
  	unsigned long total_size;
- if (!info || !info->screen_base)
+	if (!info)
  		return -ENODEV;
if (info->state != FBINFO_STATE_RUNNING)
@@ -842,6 +845,9 @@ fb_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
  	if (info->fbops->fb_write)
  		return info->fbops->fb_write(info, buf, count, ppos);
+ if (!info->screen_base)
+		return -ENODEV;
+
  	total_size = info->screen_size;
if (total_size == 0)
diff --git a/drivers/video/fbdev/sm712fb.c b/drivers/video/fbdev/sm712fb.c
index 6f852cd756c5..b7ad3c644e13 100644
--- a/drivers/video/fbdev/sm712fb.c
+++ b/drivers/video/fbdev/sm712fb.c
@@ -1028,7 +1028,7 @@ static ssize_t smtcfb_read(struct fb_info *info, char __user *buf,
  	int c, i, cnt = 0, err = 0;
  	unsigned long total_size;
- if (!info || !info->screen_base)
+	if (!info->screen_base)
  		return -ENODEV;
total_size = info->screen_size;
@@ -1091,7 +1091,7 @@ static ssize_t smtcfb_write(struct fb_info *info, const char __user *buf,
  	int c, i, cnt = 0, err = 0;
  	unsigned long total_size;
- if (!info || !info->screen_base)
+	if (!info->screen_base)
  		return -ENODEV;
total_size = info->screen_size;



[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux