summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2023-04-25 19:09:55 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2023-04-26 09:51:08 +0900
commit2b43ab00b08a052fc0077dd20f111c474730ad52 (patch)
treefdd9c845016d42c1b396b26e821407e75bdfe8ea
parent9203abf79f1d05fdef9b039e7addf9fc5a27752d (diff)
downloadsystemd-2b43ab00b08a052fc0077dd20f111c474730ad52.tar.gz
udev-rules: fix negative match rule for SYMLINK and TAG
Fixes #27396.
-rw-r--r--man/udev.xml15
-rw-r--r--src/udev/udev-rules.c4
2 files changed, 11 insertions, 8 deletions
diff --git a/man/udev.xml b/man/udev.xml
index 142f295f3e..332c7ac096 100644
--- a/man/udev.xml
+++ b/man/udev.xml
@@ -186,10 +186,10 @@
<varlistentry>
<term><varname>SYMLINK</varname></term>
<listitem>
- <para>Match the name of a symlink targeting the node. It can
- be used once a SYMLINK key has been set in one of the preceding
- rules. There may be multiple symlinks; only one needs to match.
- </para>
+ <para>Match the name of a symlink targeting the node. It can be used once a SYMLINK key has
+ been set in one of the preceding rules. There may be multiple symlinks; only one needs to
+ match. If the operator is <literal>!=</literal>, the token returns true only if there is no
+ symlink matched.</para>
</listitem>
</varlistentry>
@@ -287,14 +287,17 @@
<varlistentry>
<term><varname>TAG</varname></term>
<listitem>
- <para>Match against a device tag.</para>
+ <para>Match against one of device tags. It can be used once a TAG key has been set in one of
+ the preceding rules. There may be multiple tags; only one needs to match. If the operator is
+ <literal>!=</literal>, the token returns true only if there is no tag matched.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>TAGS</varname></term>
<listitem>
- <para>Search the devpath upwards for a device with matching tag.</para>
+ <para>Search the devpath upwards for a device with matching tag. If the operator is
+ <literal>!=</literal>, the token returns true only if there is no tag matched.</para>
</listitem>
</varlistentry>
diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c
index e3d2adbafd..d6e701f3cc 100644
--- a/src/udev/udev-rules.c
+++ b/src/udev/udev-rules.c
@@ -1896,7 +1896,7 @@ static int udev_rule_apply_token_to_event(
const char *val;
FOREACH_DEVICE_DEVLINK(dev, val)
- if (token_match_string(token, strempty(startswith(val, "/dev/"))))
+ if (token_match_string(token, strempty(startswith(val, "/dev/"))) == (token->op == OP_MATCH))
return token->op == OP_MATCH;
return token->op == OP_NOMATCH;
}
@@ -1926,7 +1926,7 @@ static int udev_rule_apply_token_to_event(
const char *val;
FOREACH_DEVICE_CURRENT_TAG(dev, val)
- if (token_match_string(token, val))
+ if (token_match_string(token, val) == (token->op == OP_MATCH))
return token->op == OP_MATCH;
return token->op == OP_NOMATCH;
}