diff options
-rwxr-xr-x | test/udev-test.pl | 13 | ||||
-rw-r--r-- | udev_rules.c | 10 |
2 files changed, 21 insertions, 2 deletions
diff --git a/test/udev-test.pl b/test/udev-test.pl index 1117ecb40c..464098fa65 100755 --- a/test/udev-test.pl +++ b/test/udev-test.pl @@ -1248,6 +1248,19 @@ SUBSYSTEMS=="scsi", KERNEL=="sda1", NAME="bad" EOF }, { + desc => "ENV{} test (assign 2 times)", + subsys => "block", + devpath => "/block/sda/sda1", + exp_name => "true", + rules => <<EOF +SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}="true" +SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}="absolutely-\$env{ASSIGN}" +SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}=="yes", NAME="no" +SUBSYSTEMS=="scsi", KERNEL=="sda1", ENV{ASSIGN}=="absolutely-true", NAME="true" +SUBSYSTEMS=="scsi", KERNEL=="sda1", NAME="bad" +EOF + }, + { desc => "ENV{} test (assign2)", subsys => "block", devpath => "/block/sda/sda1", diff --git a/udev_rules.c b/udev_rules.c index 8a2066d709..1483f8f493 100644 --- a/udev_rules.c +++ b/udev_rules.c @@ -802,13 +802,19 @@ try_parent: struct key_pair *pair = &rule->env.keys[i]; if (pair->key.operation == KEY_OP_ASSIGN) { + char temp_value[NAME_SIZE]; const char *key_name = key_pair_name(rule, pair); const char *value = key_val(rule, &pair->key); - char *key_value = name_list_key_add(&udev->env_list, key_name, value); + char *key_value; + + /* make sure we don't write to the same string we possibly read from */ + strlcpy(temp_value, value, sizeof(temp_value)); + udev_rules_apply_format(udev, temp_value, NAME_SIZE); + + key_value = name_list_key_add(&udev->env_list, key_name, temp_value); if (key_value == NULL) break; - udev_rules_apply_format(udev, key_value, NAME_SIZE); putenv(key_value); dbg("export ENV '%s'", key_value); } |