diff options
author | Thomas Zimmermann <tzimmermann@suse.de> | 2023-04-28 14:24:50 +0200 |
---|---|---|
committer | Thomas Zimmermann <tzimmermann@suse.de> | 2023-05-08 15:28:34 +0200 |
commit | 3f8974f68f408f4983443b745a3cf95b06112469 (patch) | |
tree | 7bf2c45c6d071b3d865efaa6135cb5d70e24069d /drivers/video/fbdev/metronomefb.c | |
parent | 453bd91302f16ddb8a2f5eb3df9fda3206dbacef (diff) | |
download | linux-stable-3f8974f68f408f4983443b745a3cf95b06112469.tar.gz linux-stable-3f8974f68f408f4983443b745a3cf95b06112469.tar.bz2 linux-stable-3f8974f68f408f4983443b745a3cf95b06112469.zip |
fbdev: Validate info->screen_{base, buffer} in fb_ops implementations
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.
While bothi fields, screen_base and screen_buffer, are stored in the
same location, they refer to different address spaces. For correctness,
we want to test each field in exactly the code that uses it.
v2:
* also test screen_base in pvr2fb (Geert)
* also test screen_buffer in ivtvfb, arcfb, broadsheetfb,
hecubafb, metronomefb and ssd1307fb (Geert)
* give a rational for the change (Geert)
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Tested-by: Sui Jingfeng <suijingfeng@loongson.cn>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Acked-by: Helge Deller <deller@gmx.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20230428122452.4856-18-tzimmermann@suse.de
Diffstat (limited to 'drivers/video/fbdev/metronomefb.c')
-rw-r--r-- | drivers/video/fbdev/metronomefb.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/video/fbdev/metronomefb.c b/drivers/video/fbdev/metronomefb.c index 2bb068cadac6..7fc59466fe6c 100644 --- a/drivers/video/fbdev/metronomefb.c +++ b/drivers/video/fbdev/metronomefb.c @@ -523,6 +523,9 @@ static ssize_t metronomefb_write(struct fb_info *info, const char __user *buf, int err = 0; unsigned long total_size; + if (!info->screen_buffer) + return -ENODEV; + total_size = info->fix.smem_len; if (p > total_size) |