udev: fix bounds check in dev_if_packed_info()

The check compared bLength against (size - sizeof(descriptor)), which
is an absolute limit unrelated to the current buffer position. Since
bLength is uint8_t (max 255), this can never exceed size - 9 for any
realistic input, making the check dead code.

Use (size - pos) instead so the check actually catches descriptors
that extend past the end of the read data.

Fixes: https://github.com/systemd/systemd/issues/41570
This commit is contained in:
Milan Kyselica
2026-04-09 21:48:09 +01:00
committed by Luca Boccassi
parent 5ade3f6a01
commit 4b32ab5a36
+1 -1
View File
@@ -168,7 +168,7 @@ static int dev_if_packed_info(sd_device *dev, char *ifs_str, size_t len) {
desc = (struct usb_interface_descriptor *) (buf + pos);
if (desc->bLength < 3)
break;
if (desc->bLength > size - sizeof(struct usb_interface_descriptor))
if (desc->bLength > (size_t) size - pos)
return log_device_debug_errno(dev, SYNTHETIC_ERRNO(EIO),
"Corrupt data read from \"%s\"", filename);
pos += desc->bLength;