chiark / gitweb /
udevd: be more careful when matching against parents
authorAlan Jenkins <alan-jenkins@tuffmail.co.uk>
Sat, 1 Nov 2008 16:32:16 +0000 (17:32 +0100)
committerKay Sievers <kay.sievers@vrfy.org>
Sat, 1 Nov 2008 16:32:16 +0000 (17:32 +0100)
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 <alan-jenkins@tuffmail.co.uk>
udev/udev-rules.c

index 77029f7..e130725 100644 (file)
@@ -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: