Prevent that drivers or the user sets the virtual screen resolution
smaller than the physical screen resolution.  This is important, because
otherwise we may access memory outside of the graphics memory area.

Signed-off-by: Helge Deller <del...@gmx.de>
Reviewed-by: Daniel Vetter <daniel.vet...@ffwll.ch>
Cc: sta...@vger.kernel.org # v5.4+
---
 drivers/video/fbdev/core/fbmem.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
index afa2863670f3..5dfa4bbee642 100644
--- a/drivers/video/fbdev/core/fbmem.c
+++ b/drivers/video/fbdev/core/fbmem.c
@@ -1006,6 +1006,12 @@ fb_set_var(struct fb_info *info, struct 
fb_var_screeninfo *var)
        if (var->xres < 8 || var->yres < 8)
                return -EINVAL;

+       /* make sure virtual resolution >= physical resolution */
+       if (var->xres_virtual < var->xres)
+               return -EINVAL;
+       if (var->yres_virtual < var->yres)
+               return -EINVAL;
+
        /* Too huge resolution causes multiplication overflow. */
        if (check_mul_overflow(var->xres, var->yres, &unused) ||
            check_mul_overflow(var->xres_virtual, var->yres_virtual, &unused))
--
2.35.3

Reply via email to