diff options
author | Kay Sievers <kay.sievers@vrfy.org> | 2008-10-26 02:48:14 +0100 |
---|---|---|
committer | Kay Sievers <kay.sievers@vrfy.org> | 2008-10-26 02:48:14 +0100 |
commit | dc4c7e463df35776631150e4e18a4ba41749843c (patch) | |
tree | f0b78e73ebaf12ab6f8de66d2d2615e2d0420d95 | |
parent | 1822e9b033fcd91a7dfd3b0bfd12cfbbd93fc470 (diff) |
fix $attr{[<subsystem>/<sysname>]<attribute>} substitution
-rwxr-xr-x | test/udev-test.pl | 10 | ||||
-rw-r--r-- | udev/udev-event.c | 12 |
2 files changed, 18 insertions, 4 deletions
diff --git a/test/udev-test.pl b/test/udev-test.pl index f630b74a9d..767f6adeb4 100755 --- a/test/udev-test.pl +++ b/test/udev-test.pl @@ -1656,6 +1656,16 @@ KERNEL=="sda", MODE="440" KERNEL=="sda", PROGRAM=="/bin/echo 0 0 0400letsdoabuffferoverflow0123456789012345789012345678901234567890", OWNER="%c{1}", GROUP="%c{2}", MODE="%c{3}" EOF }, + { + desc => "magic [subsys/sysname] attribute substitution", + subsys => "block", + devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda", + exp_name => "sda-8741C4G-end", + exp_perms => "0:0:0660", + rules => <<EOF +KERNEL=="sda", NAME="%k-%s{[dmi/id]product_name}-end" +EOF + }, ); diff --git a/udev/udev-event.c b/udev/udev-event.c index e297df0383..02c5c99dc1 100644 --- a/udev/udev-event.c +++ b/udev/udev-event.c @@ -295,13 +295,17 @@ found: size_t size; value[0] = '\0'; + /* read the value specified by [usb/]*/ util_resolve_subsys_kernel(event->udev, attr, value, sizeof(value), 1); - val = udev_device_get_sysattr_value(event->dev, attr); - if (val != NULL) - util_strlcpy(value, val, sizeof(value)); + /* try to read attribute of the current device */ + if (value[0] == '\0') { + val = udev_device_get_sysattr_value(event->dev, attr); + if (val != NULL) + util_strlcpy(value, val, sizeof(value)); + } - /* try the current device, other matches may have selected */ + /* try to read the attribute of the parent device, other matches have selected */ if (value[0] == '\0' && event->dev_parent != NULL && event->dev_parent != event->dev) { val = udev_device_get_sysattr_value(event->dev_parent, attr); if (val != NULL) |