summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKay Sievers <kay@vrfy.org>2014-01-22 10:47:48 +0100
committerKay Sievers <kay@vrfy.org>2014-01-22 10:47:48 +0100
commitd6f116a7b18f8bd3c6507c803217991235c7f1bb (patch)
tree465e1e1326675b6fdc801f53ad63ad43115d893d
parent069f5e61eb128aa08b6fdff12fc6ac71c3897b48 (diff)
udev: static_node - do not exit rule after first static_node item
The nodes usually do not exist, so handle the next item instead of skipping the entire rule.
-rw-r--r--src/udev/udev-rules.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c
index 8d2b057e2f..855a4e4060 100644
--- a/src/udev/udev-rules.c
+++ b/src/udev/udev-rules.c
@@ -900,6 +900,7 @@ static int rule_add_key(struct rule_tmp *rule_tmp, enum token_type type,
case TK_A_GOTO:
case TK_M_TAG:
case TK_A_TAG:
+ case TK_A_STATIC_NODE:
token->key.value_off = rules_add_string(rule_tmp->rules, value);
break;
case TK_M_IMPORT_BUILTIN:
@@ -943,9 +944,6 @@ static int rule_add_key(struct rule_tmp *rule_tmp, enum token_type type,
case TK_A_MODE_ID:
token->key.mode = *(mode_t *)data;
break;
- case TK_A_STATIC_NODE:
- token->key.value_off = rules_add_string(rule_tmp->rules, value);
- break;
case TK_M_EVENT_TIMEOUT:
token->key.event_timeout = *(int *)data;
break;
@@ -993,7 +991,7 @@ static int rule_add_key(struct rule_tmp *rule_tmp, enum token_type type,
}
if (attr != NULL) {
- /* check if property/attribut name has substitution chars */
+ /* check if property/attribute name has substitution chars */
if (attr[0] == '[')
token->key.attrsubst = SB_SUBSYS;
else if (strchr(attr, '%') != NULL || strchr(attr, '$') != NULL)
@@ -2561,15 +2559,11 @@ int udev_rules_apply_static_dev_perms(struct udev_rules *rules)
/* we assure, that the permissions tokens are sorted before the static token */
if (mode == 0 && uid == 0 && gid == 0 && tags == NULL)
goto next;
+
strscpyl(device_node, sizeof(device_node), "/dev/", rules_str(rules, cur->key.value_off), NULL);
- if (stat(device_node, &stats) != 0)
- goto next;
- if (!S_ISBLK(stats.st_mode) && !S_ISCHR(stats.st_mode))
- goto next;
+ /* export the tags to a directory as symlinks, allowing otherwise dead nodes to be tagged */
if (tags) {
- /* Export the tags to a directory as symlinks, allowing otherwise dead nodes to be tagged */
-
STRV_FOREACH(t, tags) {
_cleanup_free_ char *unescaped_filename = NULL;
@@ -2594,7 +2588,12 @@ int udev_rules_apply_static_dev_perms(struct udev_rules *rules)
/* don't touch the permissions if only the tags were set */
if (mode == 0 && uid == 0 && gid == 0)
- goto next;
+ break;
+
+ if (stat(device_node, &stats) != 0)
+ break;
+ if (!S_ISBLK(stats.st_mode) && !S_ISCHR(stats.st_mode))
+ break;
if (mode == 0) {
if (gid > 0)