chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix possible endless loop for GOTO to non-existent LABEL
[elogind.git]
/
udev
/
udev-rules.c
diff --git
a/udev/udev-rules.c
b/udev/udev-rules.c
index fac418e526a625099d8b96adec4711b50fd2b3fb..b8b7e52c839f2b93c06c7ee41a726b3fe6e93408 100644
(file)
--- 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;
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);
}
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:
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:
cur = &rules->tokens[cur->key.rule_goto];
continue;
case TK_A_LAST_RULE: