diff options
author | Patrick Rudolph <siro@das-labor.org> | 2018-02-10 12:03:58 +0100 |
---|---|---|
committer | Nico Huber <nico.h@gmx.de> | 2018-10-01 16:58:29 +0000 |
commit | 1fea734e540ed84e93356381db9d694659477132 (patch) | |
tree | 88d2b939713f7ede4f94bd0783d6c1c2ba821f43 | |
parent | d5a70bdfd5b09d8438b8883e72f02f0d11d90e0e (diff) | |
download | coreboot-1fea734e540ed84e93356381db9d694659477132.tar.gz coreboot-1fea734e540ed84e93356381db9d694659477132.tar.bz2 coreboot-1fea734e540ed84e93356381db9d694659477132.zip |
libpayload/drivers/usb: Fix leaks
Don't leak buffers on device detach.
Tested on qemu using:
qemu-system-x86_64 -bios build/coreboot.rom -M pc -m 2048 -usb \
-device usb-ehci,id=ehci -device usb-mouse -device usb-audio,bus=usb-bus.0 \
-device usb-bt-dongle,bus=usb-bus.0 -device usb-kbd
Change-Id: Ib2d80dd4590aa0dacdf2da3b614c6505c931d0be
Signed-off-by: Patrick Rudolph <siro@das-labor.org>
Reviewed-on: https://review.coreboot.org/23689
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
-rw-r--r-- | payloads/libpayload/drivers/usb/usb.c | 7 | ||||
-rw-r--r-- | payloads/libpayload/drivers/usb/usb_dev.c | 5 | ||||
-rw-r--r-- | payloads/libpayload/drivers/usb/usbhid.c | 3 |
3 files changed, 12 insertions, 3 deletions
diff --git a/payloads/libpayload/drivers/usb/usb.c b/payloads/libpayload/drivers/usb/usb.c index a6d5d43c2338..62604a27ca19 100644 --- a/payloads/libpayload/drivers/usb/usb.c +++ b/payloads/libpayload/drivers/usb/usb.c @@ -638,8 +638,15 @@ usb_detach_device(hci_t *controller, int devno) been called yet by the usb class driver */ if (controller->devices[devno]) { controller->devices[devno]->destroy (controller->devices[devno]); + if (controller->destroy_device) controller->destroy_device(controller, devno); + + free(controller->devices[devno]->descriptor); + controller->devices[devno]->descriptor = NULL; + free(controller->devices[devno]->configuration); + controller->devices[devno]->configuration = NULL; + /* Tear down the device itself *after* destroy_device() * has had a chance to interoogate it. */ free(controller->devices[devno]); diff --git a/payloads/libpayload/drivers/usb/usb_dev.c b/payloads/libpayload/drivers/usb/usb_dev.c index 9a0aecda7b24..e67f6e3d7a65 100644 --- a/payloads/libpayload/drivers/usb/usb_dev.c +++ b/payloads/libpayload/drivers/usb/usb_dev.c @@ -32,8 +32,6 @@ static void usb_nop_destroy (usbdev_t *dev) { - if (dev->descriptor != 0) - free (dev->descriptor); usb_nop_init (dev); dev->address = -1; dev->hub = -1; @@ -49,7 +47,8 @@ usb_nop_poll (usbdev_t *dev) void usb_nop_init (usbdev_t *dev) { - dev->descriptor = 0; + dev->descriptor = NULL; + dev->configuration = NULL; dev->destroy = usb_nop_destroy; dev->poll = usb_nop_poll; } diff --git a/payloads/libpayload/drivers/usb/usbhid.c b/payloads/libpayload/drivers/usb/usbhid.c index 67aebb2ffde9..22ed8e78850e 100644 --- a/payloads/libpayload/drivers/usb/usbhid.c +++ b/payloads/libpayload/drivers/usb/usbhid.c @@ -80,6 +80,9 @@ usb_hid_destroy (usbdev_t *dev) &dev->endpoints[i], HID_INST(dev)->queue); HID_INST(dev)->queue = NULL; } + free(HID_INST(dev)->descriptor); + HID_INST(dev)->descriptor = NULL; + free (dev->data); } |