From 0c37798916bc87d72f5f1399d9e050307901db84 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Wed, 13 May 2009 18:01:32 +0200 Subject: [PATCH] fix possible endless loop for GOTO to non-existent LABEL http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=526365 --- test/udev-test.pl | 11 +++++++++++ udev/udev-rules.c | 3 +++ 2 files changed, 14 insertions(+) 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 @@ -1554,6 +1554,17 @@ KERNEL=="sda1", GOTO="BAD" KERNEL=="sda1", NAME="", LABEL="NO" KERNEL=="sda1", NAME="right", LABEL="TEST" 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 => <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: