Patch "video: hyperv_fb: Fix validation of screen resolution" has been added to the 5.10-stable tree

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

 



This is a note to let you know that I've just added the patch titled

    video: hyperv_fb: Fix validation of screen resolution

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     video-hyperv_fb-fix-validation-of-screen-resolution.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit ee44596bd54c0d93cdb3e29c0d1a4a12d3286344
Author: Michael Kelley <mikelley@xxxxxxxxxxxxx>
Date:   Sun Jan 16 11:18:31 2022 -0800

    video: hyperv_fb: Fix validation of screen resolution
    
    [ Upstream commit 9ff5549b1d1d3c3a9d71220d44bd246586160f1d ]
    
    In the WIN10 version of the Synthetic Video protocol with Hyper-V,
    Hyper-V reports a list of supported resolutions as part of the protocol
    negotiation. The driver calculates the maximum width and height from
    the list of resolutions, and uses those maximums to validate any screen
    resolution specified in the video= option on the kernel boot line.
    
    This method of validation is incorrect. For example, the list of
    supported resolutions could contain 1600x1200 and 1920x1080, both of
    which fit in an 8 Mbyte frame buffer.  But calculating the max width
    and height yields 1920 and 1200, and 1920x1200 resolution does not fit
    in an 8 Mbyte frame buffer.  Unfortunately, this resolution is accepted,
    causing a kernel fault when the driver accesses memory outside the
    frame buffer.
    
    Instead, validate the specified screen resolution by calculating
    its size, and comparing against the frame buffer size.  Delete the
    code for calculating the max width and height from the list of
    resolutions, since these max values have no use.  Also add the
    frame buffer size to the info message to aid in understanding why
    a resolution might be rejected.
    
    Fixes: 67e7cdb4829d ("video: hyperv: hyperv_fb: Obtain screen resolution from Hyper-V host")
    Signed-off-by: Michael Kelley <mikelley@xxxxxxxxxxxxx>
    Reviewed-by: Haiyang Zhang <haiyangz@xxxxxxxxxxxxx>
    Acked-by: Helge Deller <deller@xxxxxx>
    Link: https://lore.kernel.org/r/1642360711-2335-1-git-send-email-mikelley@xxxxxxxxxxxxx
    Signed-off-by: Wei Liu <wei.liu@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/video/fbdev/hyperv_fb.c b/drivers/video/fbdev/hyperv_fb.c
index 4dc9077dd2ac0..3c309ab208874 100644
--- a/drivers/video/fbdev/hyperv_fb.c
+++ b/drivers/video/fbdev/hyperv_fb.c
@@ -286,8 +286,6 @@ struct hvfb_par {
 
 static uint screen_width = HVFB_WIDTH;
 static uint screen_height = HVFB_HEIGHT;
-static uint screen_width_max = HVFB_WIDTH;
-static uint screen_height_max = HVFB_HEIGHT;
 static uint screen_depth;
 static uint screen_fb_size;
 static uint dio_fb_size; /* FB size for deferred IO */
@@ -581,7 +579,6 @@ static int synthvid_get_supported_resolution(struct hv_device *hdev)
 	int ret = 0;
 	unsigned long t;
 	u8 index;
-	int i;
 
 	memset(msg, 0, sizeof(struct synthvid_msg));
 	msg->vid_hdr.type = SYNTHVID_RESOLUTION_REQUEST;
@@ -612,13 +609,6 @@ static int synthvid_get_supported_resolution(struct hv_device *hdev)
 		goto out;
 	}
 
-	for (i = 0; i < msg->resolution_resp.resolution_count; i++) {
-		screen_width_max = max_t(unsigned int, screen_width_max,
-		    msg->resolution_resp.supported_resolution[i].width);
-		screen_height_max = max_t(unsigned int, screen_height_max,
-		    msg->resolution_resp.supported_resolution[i].height);
-	}
-
 	screen_width =
 		msg->resolution_resp.supported_resolution[index].width;
 	screen_height =
@@ -940,7 +930,7 @@ static void hvfb_get_option(struct fb_info *info)
 
 	if (x < HVFB_WIDTH_MIN || y < HVFB_HEIGHT_MIN ||
 	    (synthvid_ver_ge(par->synthvid_version, SYNTHVID_VERSION_WIN10) &&
-	    (x > screen_width_max || y > screen_height_max)) ||
+	    (x * y * screen_depth / 8 > screen_fb_size)) ||
 	    (par->synthvid_version == SYNTHVID_VERSION_WIN8 &&
 	     x * y * screen_depth / 8 > SYNTHVID_FB_SIZE_WIN8) ||
 	    (par->synthvid_version == SYNTHVID_VERSION_WIN7 &&
@@ -1193,8 +1183,8 @@ static int hvfb_probe(struct hv_device *hdev,
 	}
 
 	hvfb_get_option(info);
-	pr_info("Screen resolution: %dx%d, Color depth: %d\n",
-		screen_width, screen_height, screen_depth);
+	pr_info("Screen resolution: %dx%d, Color depth: %d, Frame buffer size: %d\n",
+		screen_width, screen_height, screen_depth, screen_fb_size);
 
 	ret = hvfb_getmem(hdev, info);
 	if (ret) {



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux