[systemd-devel] [PATCH] fix strict aliasing violations in src/udev/udev-builtin-usb_id.c

Shawn Landden shawn at churchofgit.com
Tue Mar 10 19:13:16 PDT 2015


also switch to <inttypes.h>
---
 src/udev/udev-builtin-usb_id.c | 34 +++++++++++++++++-----------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/src/udev/udev-builtin-usb_id.c b/src/udev/udev-builtin-usb_id.c
index ab0d96e..b42b32e 100644
--- a/src/udev/udev-builtin-usb_id.c
+++ b/src/udev/udev-builtin-usb_id.c
@@ -28,6 +28,7 @@
 #include <ctype.h>
 #include <fcntl.h>
 #include <errno.h>
+#include <inttypes.h>
 
 #include "udev.h"
 
@@ -153,15 +154,15 @@ static int dev_if_packed_info(struct udev_device *dev, char *ifs_str, size_t len
         int 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;
+                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;
         } __attribute__((packed));
 
         if (asprintf(&filename, "%s/descriptors", udev_device_get_syspath(dev)) < 0)
@@ -179,21 +180,20 @@ static int dev_if_packed_info(struct udev_device *dev, char *ifs_str, size_t len
 
         ifs_str[0] = '\0';
         while (pos < size && strpos+7 < len-2) {
-                struct usb_interface_descriptor *desc;
+                char *desc = &buf[pos];
                 char if_str[8];
 
-                desc = (struct usb_interface_descriptor *) &buf[pos];
-                if (desc->bLength < 3)
+                if (desc[offsetof(struct usb_interface_descriptor, bLength)] < 3)
                         break;
-                pos += desc->bLength;
+                pos += desc[offsetof(struct usb_interface_descriptor, bLength)];
 
-                if (desc->bDescriptorType != USB_DT_INTERFACE)
+                if (desc[offsetof(struct usb_interface_descriptor, bDescriptorType)] != USB_DT_INTERFACE)
                         continue;
 
                 if (snprintf(if_str, 8, ":%02x%02x%02x",
-                             desc->bInterfaceClass,
-                             desc->bInterfaceSubClass,
-                             desc->bInterfaceProtocol) != 7)
+                             desc[offsetof(struct usb_interface_descriptor, bInterfaceClass)],
+                             desc[offsetof(struct usb_interface_descriptor, bInterfaceSubClass)],
+                             desc[offsetof(struct usb_interface_descriptor, bInterfaceProtocol)]) != 7)
                         continue;
 
                 if (strstr(ifs_str, if_str) != NULL)
-- 
2.2.1.209.g41e5f3a



More information about the systemd-devel mailing list