diff options
Diffstat (limited to 'config/udev.c')
-rw-r--r-- | config/udev.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/config/udev.c b/config/udev.c index 496bfbf11..e401894a4 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) { |