chiark / gitweb /
rules: mount fuse filesystem only 'add'
[elogind.git] / udev / udev-rules.c
index a77e1e223f1406172cc91900e8a552eabc5a1eba..7db0767303820c5af312ffb90995736fee2ba810 100644 (file)
@@ -2526,11 +2526,25 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event
                        }
                        break;
                }
-               case TK_A_TAG:
+               case TK_A_TAG: {
+                       char tag[UTIL_PATH_SIZE];
+                       const char *p;
+
+                       udev_event_apply_format(event, &rules->buf[cur->key.value_off], tag, sizeof(tag));
                        if (cur->key.op == OP_ASSIGN || cur->key.op == OP_ASSIGN_FINAL)
                                udev_device_cleanup_tags_list(event->dev);
-                       udev_device_add_tag(event->dev, &rules->buf[cur->key.value_off]);
+                       for (p = tag; *p != '\0'; p++) {
+                               if ((*p >= 'a' && *p <= 'z') ||
+                                   (*p >= 'A' && *p <= 'Z') ||
+                                   (*p >= '0' && *p <= '9') ||
+                                   *p == '-' || *p == '_')
+                                       continue;
+                               err(event->udev, "ignoring invalid tag name '%s'\n", tag);
+                               break;
+                       }
+                       udev_device_add_tag(event->dev, tag);
                        break;
+               }
                case TK_A_NAME: {
                        const char *name  = &rules->buf[cur->key.value_off];
                        char name_str[UTIL_PATH_SIZE];
@@ -2705,6 +2719,7 @@ void udev_rules_apply_static_dev_perms(struct udev_rules *rules)
                case TK_A_STATIC_NODE: {
                        char filename[UTIL_PATH_SIZE];
                        struct stat stats;
+
                        /* we assure, that the permissions tokens are sorted before the static token */
                        if (mode == 0 && uid == 0 && gid == 0)
                                goto next;
@@ -2714,14 +2729,19 @@ void udev_rules_apply_static_dev_perms(struct udev_rules *rules)
                                goto next;
                        if (!S_ISBLK(stats.st_mode) && !S_ISCHR(stats.st_mode))
                                goto next;
-                       if (mode != 0 && mode != (stats.st_mode & 0777)) {
+
+                       if (mode == 0 && gid > 0)
+                               mode = 0660;
+                       if (mode != (stats.st_mode & 0777)) {
                                chmod(filename, mode);
                                info(rules->udev, "chmod '%s' %#o\n", filename, mode);
                        }
+
                        if ((uid != 0 && uid != stats.st_uid) || (gid != 0 && gid != stats.st_gid)) {
                                chown(filename, uid, gid);
                                info(rules->udev, "chown '%s' %u %u\n", filename, uid, gid);
                        }
+
                        utimensat(AT_FDCWD, filename, NULL, 0);
                        break;
                }