Skip to content

Commit 754e438

Browse files
pskrgagStefan-Schmidt
authored andcommitted
ieee802154: atusb: fix uninit value in atusb_set_extended_addr
Alexander reported a use of uninitialized value in atusb_set_extended_addr(), that is caused by reading 0 bytes via usb_control_msg(). Fix it by validating if the number of bytes transferred is actually correct, since usb_control_msg() may read less bytes, than was requested by caller. Fail log: BUG: KASAN: uninit-cmp in ieee802154_is_valid_extended_unicast_addr include/linux/ieee802154.h:310 [inline] BUG: KASAN: uninit-cmp in atusb_set_extended_addr drivers/net/ieee802154/atusb.c:1000 [inline] BUG: KASAN: uninit-cmp in atusb_probe.cold+0x29f/0x14db drivers/net/ieee802154/atusb.c:1056 Uninit value used in comparison: 311daa649a2003bd stack handle: 000000009a2003bd ieee802154_is_valid_extended_unicast_addr include/linux/ieee802154.h:310 [inline] atusb_set_extended_addr drivers/net/ieee802154/atusb.c:1000 [inline] atusb_probe.cold+0x29f/0x14db drivers/net/ieee802154/atusb.c:1056 usb_probe_interface+0x314/0x7f0 drivers/usb/core/driver.c:396 Fixes: 7490b00 ("ieee802154: add support for atusb transceiver") Reported-by: Alexander Potapenko <[email protected]> Acked-by: Alexander Aring <[email protected]> Signed-off-by: Pavel Skripkin <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Stefan Schmidt <[email protected]>
1 parent 7d18a07 commit 754e438

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

drivers/net/ieee802154/atusb.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,9 @@ static int atusb_control_msg(struct atusb *atusb, unsigned int pipe,
9393

9494
ret = usb_control_msg(usb_dev, pipe, request, requesttype,
9595
value, index, data, size, timeout);
96-
if (ret < 0) {
96+
if (ret < size) {
97+
ret = ret < 0 ? ret : -ENODATA;
98+
9799
atusb->err = ret;
98100
dev_err(&usb_dev->dev,
99101
"%s: req 0x%02x val 0x%x idx 0x%x, error %d\n",
@@ -861,9 +863,9 @@ static int atusb_get_and_show_build(struct atusb *atusb)
861863
if (!build)
862864
return -ENOMEM;
863865

864-
ret = atusb_control_msg(atusb, usb_rcvctrlpipe(usb_dev, 0),
865-
ATUSB_BUILD, ATUSB_REQ_FROM_DEV, 0, 0,
866-
build, ATUSB_BUILD_SIZE, 1000);
866+
/* We cannot call atusb_control_msg() here, since this request may read various length data */
867+
ret = usb_control_msg(atusb->usb_dev, usb_rcvctrlpipe(usb_dev, 0), ATUSB_BUILD,
868+
ATUSB_REQ_FROM_DEV, 0, 0, build, ATUSB_BUILD_SIZE, 1000);
867869
if (ret >= 0) {
868870
build[ret] = 0;
869871
dev_info(&usb_dev->dev, "Firmware: build %s\n", build);

0 commit comments

Comments
 (0)