Thread (4 messages) 4 messages, 3 authors, 2021-03-24

RE: [PATCH] video/fbdev: Fix a double free in hvfb_probe

From: Michael Kelley <hidden>
Date: 2021-03-23 18:52:45
Also in: dri-devel, linux-hyperv, lkml

From: Lv Yunlong <redacted> Sent: Tuesday, March 23, 2021 12:34 AM
quoted hunk ↗ jump to hunk
In function hvfb_probe in hyperv_fb.c, it calls hvfb_getmem(hdev, info)
and return err when info->apertures is freed.

In the error1 label of hvfb_probe, info->apertures will be freed twice
by framebuffer_release(info).

My patch sets info->apertures to NULL after it was freed to avoid
double free.

Signed-off-by: Lv Yunlong <redacted>
---
 drivers/video/fbdev/hyperv_fb.c | 3 +++
 1 file changed, 3 insertions(+)
diff --git a/drivers/video/fbdev/hyperv_fb.c b/drivers/video/fbdev/hyperv_fb.c
index c8b0ae676809..2fc9b507e73a 100644
--- a/drivers/video/fbdev/hyperv_fb.c
+++ b/drivers/video/fbdev/hyperv_fb.c
@@ -1032,6 +1032,7 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info
*info)
 		if (!pdev) {
 			pr_err("Unable to find PCI Hyper-V video\n");
 			kfree(info->apertures);
+			info->apertures = NULL;
 			return -ENODEV;
 		}
@@ -1130,6 +1131,7 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info
*info)
 		pci_dev_put(pdev);
 	}
 	kfree(info->apertures);
+	info->apertures = NULL;

 	return 0;
@@ -1142,6 +1144,7 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info
*info)
 	if (!gen2vm)
 		pci_dev_put(pdev);
 	kfree(info->apertures);
+	info->apertures = NULL;

 	return -ENOMEM;
 }
--
2.25.1
While I think this works, a slightly better solution might be to remove
all calls to kfree(info->apertures) in hvfb_getmem(),  and just let
framebuffer_release() handle freeing the memory.  That's what is
done in other drivers that follow the fbdev pattern, and it's less
code overall.  

Michael
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help