summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtest/udev-test.pl25
-rw-r--r--udev/udev-rules.c31
2 files changed, 43 insertions, 13 deletions
diff --git a/test/udev-test.pl b/test/udev-test.pl
index 9725aff5ba..f630b74a9d 100755
--- a/test/udev-test.pl
+++ b/test/udev-test.pl
@@ -1451,6 +1451,31 @@ KERNEL=="dontknow*|ttyACM*|nothing*", NAME="right"
EOF
},
{
+ desc => "test multi matches 3",
+ subsys => "tty",
+ devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
+ exp_name => "right",
+ rules => <<EOF
+KERNEL=="dontknow|nothing", NAME="nomatch"
+KERNEL=="dontknow|ttyACM0a|nothing|attyACM0", NAME="wrong1"
+KERNEL=="X|attyACM0|dontknow|ttyACM0a|nothing|attyACM0", NAME="wrong2"
+KERNEL=="dontknow|ttyACM0|nothing", NAME="right"
+EOF
+ },
+ {
+ desc => "test multi matches 4",
+ subsys => "tty",
+ devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
+ exp_name => "right",
+ rules => <<EOF
+KERNEL=="dontknow|nothing", NAME="nomatch"
+KERNEL=="dontknow|ttyACM0a|nothing|attyACM0", NAME="wrong1"
+KERNEL=="X|attyACM0|dontknow|ttyACM0a|nothing|attyACM0", NAME="wrong2"
+KERNEL=="all|dontknow|ttyACM0", NAME="right"
+KERNEL=="ttyACM0a|nothing", NAME="wrong3"
+EOF
+ },
+ {
desc => "IMPORT parent test sequence 1/2 (keep)",
subsys => "block",
devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda",
diff --git a/udev/udev-rules.c b/udev/udev-rules.c
index 0643811d7a..8c0e1d961b 100644
--- a/udev/udev-rules.c
+++ b/udev/udev-rules.c
@@ -1726,21 +1726,26 @@ static int match_key(struct udev_rules *rules, struct token *token, const char *
break;
case GL_SPLIT:
{
- char value[UTIL_PATH_SIZE];
+ const char *split;
+ size_t len;
- util_strlcpy(value, &rules->buf[token->key.value_off], sizeof(value));
- key_value = value;
- while (key_value != NULL) {
- pos = strchr(key_value, '|');
- if (pos != NULL) {
- pos[0] = '\0';
- pos = &pos[1];
- }
- dbg(rules->udev, "match %s '%s' <-> '%s'\n", token_str[token->type], key_value, val);
- match = (strcmp(key_value, val) == 0);
- if (match)
+ split = &rules->buf[token->key.value_off];
+ len = strlen(val);
+ while (1) {
+ const char *next;
+
+ next = strchr(split, '|');
+ if (next != NULL) {
+ size_t matchlen = (size_t)(next - split);
+
+ match = (matchlen == len && strncmp(split, val, matchlen) == 0);
+ if (match)
+ break;
+ } else {
+ match = (strcmp(split, val) == 0);
break;
- key_value = pos;
+ }
+ split = &next[1];
}
break;
}