]> www.infradead.org Git - users/dwmw2/linux.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>
Wed, 31 Jul 2019 05:28:20 +0000 (07:28 +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 84308569e7dc12a7911304fc4c8c2abb72b49082..b3413404f91a565d640df3c7eb658d95808605b0 100644 (file)
@@ -287,12 +287,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);