From: Alan Jenkins Date: Sat, 1 Nov 2008 16:32:16 +0000 (+0100) Subject: udevd: be more careful when matching against parents X-Git-Tag: 174~1359 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d15fcce4b3e90a27eb911bd954efd07219c1c9db;p=systemd udevd: be more careful when matching against parents I'm worried about what will happen with things like KERNELS=="*" # pointless rule KERNELS=="doesnt-match" # another pointless rule Since TK_RULE < TK_M_PARENTS_MAX, we will try to match all three tokens against parents of the current device. I can't think of a bad case, but it's not exactly good either. Signed-off-by: Alan Jenkins --- diff --git a/udev/udev-rules.c b/udev/udev-rules.c index 77029f7b..e1307252 100644 --- a/udev/udev-rules.c +++ b/udev/udev-rules.c @@ -93,6 +93,7 @@ enum token_type { TK_M_WAITFOR, /* val */ TK_M_ATTR, /* val, attr */ + TK_M_PARENTS_MIN, TK_M_KERNELS, /* val */ TK_M_SUBSYSTEMS, /* val */ TK_M_DRIVERS, /* val */ @@ -146,6 +147,7 @@ static const char *token_str[] = { [TK_M_WAITFOR] = "M WAITFOR", [TK_M_ATTR] = "M ATTR", + [TK_M_PARENTS_MIN] = "M PARENTS_MIN", [TK_M_KERNELS] = "M KERNELS", [TK_M_SUBSYSTEMS] = "M SUBSYSTEMS", [TK_M_DRIVERS] = "M DRIVERS", @@ -806,6 +808,7 @@ static int rule_add_token(struct rule_tmp *rule_tmp, enum token_type type, token->key.event_timeout = *(int *)data; break; case TK_RULE: + case TK_M_PARENTS_MIN: case TK_M_PARENTS_MAX: case TK_M_MAX: case TK_END: @@ -943,6 +946,7 @@ static void dump_token(struct udev_rules *rules, struct token *token) case TK_END: dbg(rules->udev, "* %s\n", token_str[type]); break; + case TK_M_PARENTS_MIN: case TK_M_PARENTS_MAX: case TK_M_MAX: case TK_UNSET: @@ -1937,7 +1941,7 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event /* get whole sequence of parent matches */ next = cur; - while (next->type < TK_M_PARENTS_MAX) + while (next->type > TK_M_PARENTS_MIN && next->type < TK_M_PARENTS_MAX) next++; /* loop over parents */ @@ -2321,6 +2325,7 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event case TK_END: return 0; + case TK_M_PARENTS_MIN: case TK_M_PARENTS_MAX: case TK_M_MAX: case TK_UNSET: