X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fudev%2Fudev-builtin-usb_id.c;h=e6c27a901f87427c247d23faff30b1d7314a54ee;hb=a7f7d1bde43fc825c49afea3f946f5b4b3d563e0;hp=06d4191584c48096d5a6b07c680217de42c36164;hpb=9ec6e95b046de71c0198cb9d17acc5462dc76c74;p=elogind.git diff --git a/src/udev/udev-builtin-usb_id.c b/src/udev/udev-builtin-usb_id.c index 06d419158..e6c27a901 100644 --- a/src/udev/udev-builtin-usb_id.c +++ b/src/udev/udev-builtin-usb_id.c @@ -150,19 +150,19 @@ static int dev_if_packed_info(struct udev_device *dev, char *ifs_str, size_t len _cleanup_close_ int fd = -1; ssize_t size; unsigned char buf[18 + 65535]; - int pos = 0; + size_t pos = 0; unsigned strpos = 0; struct usb_interface_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - u_int8_t bInterfaceNumber; - u_int8_t bAlternateSetting; - u_int8_t bNumEndpoints; - u_int8_t bInterfaceClass; - u_int8_t bInterfaceSubClass; - u_int8_t bInterfaceProtocol; - u_int8_t iInterface; - } __attribute__((packed)); + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t bNumEndpoints; + uint8_t bInterfaceClass; + uint8_t bInterfaceSubClass; + uint8_t bInterfaceProtocol; + uint8_t iInterface; + } _packed_; if (asprintf(&filename, "%s/descriptors", udev_device_get_syspath(dev)) < 0) return log_oom(); @@ -178,7 +178,9 @@ static int dev_if_packed_info(struct udev_device *dev, char *ifs_str, size_t len return -EIO; ifs_str[0] = '\0'; - while (pos < size && strpos+7 < len-2) { + while (pos + sizeof(struct usb_interface_descriptor) < (size_t) size && + strpos + 7 < len - 2) { + struct usb_interface_descriptor *desc; char if_str[8]; @@ -471,6 +473,6 @@ fallback: const struct udev_builtin udev_builtin_usb_id = { .name = "usb_id", .cmd = builtin_usb_id, - .help = "usb device properties", + .help = "USB device properties", .run_once = true, };