]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.18.11/drm-udl-destroy-framebuffer-only-if-it-was-initialized.patch
fixes for 4.19
[thirdparty/kernel/stable-queue.git] / releases / 4.18.11 / drm-udl-destroy-framebuffer-only-if-it-was-initialized.patch
CommitLineData
9d09275e
GKH
1From fcb74da1eb8edd3a4ef9b9724f88ed709d684227 Mon Sep 17 00:00:00 2001
2From: Emil Lundmark <lndmrk@chromium.org>
3Date: Mon, 28 May 2018 16:27:11 +0200
4Subject: drm: udl: Destroy framebuffer only if it was initialized
5MIME-Version: 1.0
6Content-Type: text/plain; charset=UTF-8
7Content-Transfer-Encoding: 8bit
8
9From: Emil Lundmark <lndmrk@chromium.org>
10
11commit fcb74da1eb8edd3a4ef9b9724f88ed709d684227 upstream.
12
13This fixes a NULL pointer dereference that can happen if the UDL
14driver is unloaded before the framebuffer is initialized. This can
15happen e.g. if the USB device is unplugged right after it was plugged
16in.
17
18As explained by Stéphane Marchesin:
19
20It happens when fbdev is disabled (which is the case for Chrome OS).
21Even though intialization of the fbdev part is optional (it's done in
22udlfb_create which is the callback for fb_probe()), the teardown isn't
23optional (udl_driver_unload -> udl_fbdev_cleanup ->
24udl_fbdev_destroy).
25
26Note that udl_fbdev_cleanup *tries* to be conditional (you can see it
27does if (!udl->fbdev)) but that doesn't work, because udl->fbdev is
28always set during udl_fbdev_init.
29
30Cc: stable@vger.kernel.org
31Suggested-by: Sean Paul <seanpaul@chromium.org>
32Reviewed-by: Sean Paul <seanpaul@chromium.org>
33Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
34Signed-off-by: Emil Lundmark <lndmrk@chromium.org>
35Signed-off-by: Sean Paul <seanpaul@chromium.org>
36Link: https://patchwork.freedesktop.org/patch/msgid/20180528142711.142466-1-lndmrk@chromium.org
37Signed-off-by: Sean Paul <seanpaul@chromium.org>
38Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
39
40---
41 drivers/gpu/drm/udl/udl_fb.c | 8 +++++---
42 1 file changed, 5 insertions(+), 3 deletions(-)
43
44--- a/drivers/gpu/drm/udl/udl_fb.c
45+++ b/drivers/gpu/drm/udl/udl_fb.c
46@@ -432,9 +432,11 @@ static void udl_fbdev_destroy(struct drm
47 {
48 drm_fb_helper_unregister_fbi(&ufbdev->helper);
49 drm_fb_helper_fini(&ufbdev->helper);
50- drm_framebuffer_unregister_private(&ufbdev->ufb.base);
51- drm_framebuffer_cleanup(&ufbdev->ufb.base);
52- drm_gem_object_put_unlocked(&ufbdev->ufb.obj->base);
53+ if (ufbdev->ufb.obj) {
54+ drm_framebuffer_unregister_private(&ufbdev->ufb.base);
55+ drm_framebuffer_cleanup(&ufbdev->ufb.base);
56+ drm_gem_object_put_unlocked(&ufbdev->ufb.obj->base);
57+ }
58 }
59
60 int udl_fbdev_init(struct drm_device *dev)