chiark / gitweb /
fix possible endless loop for GOTO to non-existent LABEL
[elogind.git] / udev / udev-rules.c
index 663a6d4f047ec8a22d0e9341bdc477b3a0f56072..b8b7e52c839f2b93c06c7ee41a726b3fe6e93408 100644 (file)
@@ -737,7 +737,7 @@ static int import_program_into_properties(struct udev_device *dev, const char *p
 {
        struct udev *udev = udev_device_get_udev(dev);
        char **envp;
-       char result[2048];
+       char result[4096];
        size_t reslen;
        char *line;
 
@@ -1137,8 +1137,6 @@ static int add_rule(struct udev_rules *rules, char *line,
 {
        char *linepos;
        char *attr;
-       int physdev = 0;
-       int waitfor = 0;
        struct rule_tmp rule_tmp;
 
        memset(&rule_tmp, 0x00, sizeof(struct rule_tmp));
@@ -1280,8 +1278,6 @@ static int add_rule(struct udev_rules *rules, char *line,
                                err(rules->udev, "error parsing ENV attribute\n");
                                goto invalid;
                        }
-                       if (strncmp(attr, "PHYSDEV", 7) == 0)
-                               physdev = 1;
                        if (op < OP_MATCH_MAX) {
                                if (rule_add_key(&rule_tmp, TK_M_ENV, op, value, attr) != 0)
                                        goto invalid;
@@ -1378,7 +1374,6 @@ static int add_rule(struct udev_rules *rules, char *line,
 
                if (strcasecmp(key, "WAIT_FOR") == 0 || strcasecmp(key, "WAIT_FOR_SYSFS") == 0) {
                        rule_add_key(&rule_tmp, TK_M_WAITFOR, 0, value, NULL);
-                       waitfor = 1;
                        continue;
                }
 
@@ -1536,10 +1531,6 @@ static int add_rule(struct udev_rules *rules, char *line,
                err(rules->udev, "unknown key '%s' in %s:%u\n", key, filename, lineno);
        }
 
-       if (physdev && !waitfor)
-               err(rules->udev, "PHYSDEV* values are deprecated and not available on recent kernels, "
-                   "please fix it in %s:%u\n", filename, lineno);
-
        /* add rule token */
        rule_tmp.rule.rule.token_count = 1 + rule_tmp.token_cur;
        if (add_token(rules, &rule_tmp.rule) != 0)
@@ -1619,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);
@@ -2513,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: