X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fudev%2Fudev-builtin-usb_id.c;h=e3bbd05e4b4c0509157c57a9b0a87a59f40ff649;hp=dcb2468bf6c67f34522e9037f7fd3c67d908bc07;hb=84b6ad702e64db534f67ce32d4dd2fec00a16784;hpb=7962afbba9016ea03d9f2987fee341443fcde39d diff --git a/src/udev/udev-builtin-usb_id.c b/src/udev/udev-builtin-usb_id.c index dcb2468bf..e3bbd05e4 100644 --- a/src/udev/udev-builtin-usb_id.c +++ b/src/udev/udev-builtin-usb_id.c @@ -151,11 +151,12 @@ static void set_scsi_type(char *to, const char *from, size_t len) static int dev_if_packed_info(struct udev_device *dev, char *ifs_str, size_t len) { - char *filename = NULL; - int fd; + _cleanup_free_ char *filename = NULL; + _cleanup_close_ int fd = -1; ssize_t size; unsigned char buf[18 + 65535]; - unsigned int pos, strpos; + int pos = 0; + unsigned strpos = 0; struct usb_interface_descriptor { u_int8_t bLength; u_int8_t bDescriptorType; @@ -167,27 +168,20 @@ static int dev_if_packed_info(struct udev_device *dev, char *ifs_str, size_t len u_int8_t bInterfaceProtocol; u_int8_t iInterface; } __attribute__((packed)); - int err = 0; - if (asprintf(&filename, "%s/descriptors", udev_device_get_syspath(dev)) < 0) { - err = -1; - goto out; - } + if (asprintf(&filename, "%s/descriptors", udev_device_get_syspath(dev)) < 0) + return log_oom(); + fd = open(filename, O_RDONLY|O_CLOEXEC); if (fd < 0) { fprintf(stderr, "error opening USB device 'descriptors' file\n"); - err = -1; - goto out; + return -errno; } + size = read(fd, buf, sizeof(buf)); - close(fd); - if (size < 18 || size == sizeof(buf)) { - err = -1; - goto out; - } + if (size < 18 || size == sizeof(buf)) + return -EIO; - pos = 0; - strpos = 0; ifs_str[0] = '\0'; while (pos < size && strpos+7 < len-2) { struct usb_interface_descriptor *desc; @@ -213,13 +207,13 @@ static int dev_if_packed_info(struct udev_device *dev, char *ifs_str, size_t len memcpy(&ifs_str[strpos], if_str, 8), strpos += 7; } + if (strpos > 0) { ifs_str[strpos++] = ':'; ifs_str[strpos++] = '\0'; } -out: - free(filename); - return err; + + return 0; } /*