diff options
author | Kay Sievers <kay.sievers@vrfy.org> | 2009-05-13 18:01:32 +0200 |
---|---|---|
committer | Kay Sievers <kay.sievers@vrfy.org> | 2009-05-13 18:01:32 +0200 |
commit | 0c37798916bc87d72f5f1399d9e050307901db84 (patch) | |
tree | 362ea9a9331f74891cb5dc9b4cffd904f9ca5fa1 | |
parent | 6205f1186e4980544ea425d31770358d1b2579e4 (diff) |
fix possible endless loop for GOTO to non-existent LABEL
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=526365
-rwxr-xr-x | test/udev-test.pl | 11 | ||||
-rw-r--r-- | udev/udev-rules.c | 3 |
2 files changed, 14 insertions, 0 deletions
diff --git a/test/udev-test.pl b/test/udev-test.pl index 4f61ce3e5d..788bbeac25 100755 --- a/test/udev-test.pl +++ b/test/udev-test.pl @@ -1557,6 +1557,17 @@ KERNEL=="sda1", LABEL="BAD" EOF }, { + desc => "GOTO label does not exist", + subsys => "block", + devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1", + exp_name => "right", + rules => <<EOF +KERNEL=="sda1", GOTO="does-not-exist" +KERNEL=="sda1", NAME="right", +LABEL="exists" +EOF + }, + { desc => "NAME compare test", subsys => "block", devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1", diff --git a/udev/udev-rules.c b/udev/udev-rules.c index fac418e526..b8b7e52c83 100644 --- a/udev/udev-rules.c +++ b/udev/udev-rules.c @@ -1610,6 +1610,7 @@ static int parse_file(struct udev_rules *rules, const char *filename, unsigned s if (strcmp(label, &rules->buf[rules->tokens[j].rule.label_off]) != 0) continue; rules->tokens[i].key.rule_goto = j; + break; } if (rules->tokens[i].key.rule_goto == 0) err(rules->udev, "GOTO '%s' has no matching label in: '%s'\n", label, filename); @@ -2504,6 +2505,8 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event break; } case TK_A_GOTO: + if (cur->key.rule_goto == 0) + break; cur = &rules->tokens[cur->key.rule_goto]; continue; case TK_A_LAST_RULE: |