[PATCH 1/9 (v3)] udev: Add strdups to kill const warnings

Daniel Stone daniel at fooishbar.org
Thu Dec 30 18:00:15 PST 2010


InputAttributes wants non-const members, and while it appears safe to
cast it, just leave it be for the moment.

Signed-off-by: Daniel Stone <daniel at fooishbar.org>
Reviewed-by: Dan Nicholson <dbn.lists at gmail.com>
---
 config/udev.c |   17 ++++++++++++-----
 1 files changed, 12 insertions(+), 5 deletions(-)

v2: v1 was somewhat broken, and missing NULL checks around the newly-introduced
strdups.  Oops.

v3: And v2 would leak a string for unnamed devices.  Oops.

diff --git a/config/udev.c b/config/udev.c
index 496bfbf..e401894 100644
--- a/config/udev.c
+++ b/config/udev.c
@@ -94,6 +94,7 @@ device_added(struct udev_device *udev_device)
     if (parent) {
         const char *ppath = udev_device_get_devnode(parent);
         const char *product = udev_device_get_property_value(parent, "PRODUCT");
+        const char *pnp_id = udev_device_get_sysattr_value(parent, "id");
         unsigned int usb_vendor, usb_model;
 
         name = udev_device_get_sysattr_value(parent, "name");
@@ -103,8 +104,9 @@ device_added(struct udev_device *udev_device)
             LOG_PROPERTY(ppath, "NAME", name);
         }
 
-        attrs.pnp_id = udev_device_get_sysattr_value(parent, "id");
-        LOG_SYSATTR(ppath, "id", attrs.pnp_id);
+        if (pnp_id)
+            attrs.pnp_id = strdup(pnp_id);
+        LOG_SYSATTR(ppath, "id", pnp_id);
 
         /* construct USB ID in lowercase hex - "0000:ffff" */
         if (product && sscanf(product, "%*x/%4x/%4x/%*x", &usb_vendor, &usb_model) == 2) {
@@ -118,12 +120,13 @@ device_added(struct udev_device *udev_device)
     if (!name)
         name = "(unnamed)";
     else
-        attrs.product = name;
+        attrs.product = strdup(name);
     add_option(&options, "name", name);
 
     add_option(&options, "path", path);
     add_option(&options, "device", path);
-    attrs.device = path;
+    if (path)
+        attrs.device = strdup(path);
 
     tags_prop = udev_device_get_property_value(udev_device, "ID_INPUT.tags");
     LOG_PROPERTY(path, "ID_INPUT.tags", tags_prop);
@@ -162,7 +165,7 @@ device_added(struct udev_device *udev_device)
                 add_option(&options, "xkb_options", value);
         } else if (!strcmp(key, "ID_VENDOR")) {
             LOG_PROPERTY(path, key, value);
-            attrs.vendor = value;
+            attrs.vendor = strdup(value);
         } else if (!strcmp(key, "ID_INPUT_KEY")) {
             LOG_PROPERTY(path, key, value);
             attrs.flags |= ATTR_KEYBOARD;
@@ -202,6 +205,10 @@ device_added(struct udev_device *udev_device)
     }
 
     free(attrs.usb_id);
+    free(attrs.pnp_id);
+    free(attrs.product);
+    free(attrs.device);
+    free(attrs.vendor);
     if (attrs.tags) {
         char **tag = attrs.tags;
         while (*tag) {
-- 
1.7.2.3



More information about the xorg-devel mailing list