]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: dvb: usb: fix use after free in dvb_usb_device_exit
authorOliver Neukum <oneukum@suse.com>
Tue, 30 Apr 2019 13:07:36 +0000 (09:07 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 4 Aug 2019 07:34:40 +0000 (09:34 +0200)
[ Upstream commit 6cf97230cd5f36b7665099083272595c55d72be7 ]

dvb_usb_device_exit() frees and uses the device name in that order.
Fix by storing the name in a buffer before freeing it.

Signed-off-by: Oliver Neukum <oneukum@suse.com>
Reported-by: syzbot+26ec41e9f788b3eba396@syzkaller.appspotmail.com
Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/media/usb/dvb-usb/dvb-usb-init.c

index 1adf325012f7340f9648ae46b5df72532beeb94c..97a89ef7e4c1508d4e6ea5895207e5b6b544d623 100644 (file)
@@ -286,12 +286,15 @@ EXPORT_SYMBOL(dvb_usb_device_init);
 void dvb_usb_device_exit(struct usb_interface *intf)
 {
        struct dvb_usb_device *d = usb_get_intfdata(intf);
-       const char *name = "generic DVB-USB module";
+       const char *default_name = "generic DVB-USB module";
+       char name[40];
 
        usb_set_intfdata(intf, NULL);
        if (d != NULL && d->desc != NULL) {
-               name = d->desc->name;
+               strscpy(name, d->desc->name, sizeof(name));
                dvb_usb_exit(d);
+       } else {
+               strscpy(name, default_name, sizeof(name));
        }
        info("%s successfully deinitialized and disconnected.", name);