sd-device,udev: tag must be a valid filename

All tags are managed under /run/udev/tags, and the directories there are
named with tags. Hence, each tag must be a valid filename.

This also makes all validity check moved to sd-device side, and
makes failure caused by setting invalid tags non-critical.

With this change, an empty string cannot be assigned to TAG=, hence the
test cases are adjusted.
This commit is contained in:
Yu Watanabe
2023-04-08 04:49:46 +09:00
parent 2c5f119c3c
commit 0b4c70b47a
4 changed files with 34 additions and 15 deletions
@@ -351,6 +351,8 @@ static int device_amend(sd_device *device, const char *key, const char *value) {
return r;
if (r == 0)
break;
if (isempty(word))
continue;
r = device_add_tag(device, word, streq(key, "CURRENT_TAGS"));
if (r < 0)
+1 -1
View File
@@ -1439,7 +1439,7 @@ _public_ int sd_device_get_diskseq(sd_device *device, uint64_t *ret) {
static bool is_valid_tag(const char *tag) {
assert(tag);
return !strchr(tag, ':') && !strchr(tag, ' ');
return in_charset(tag, ALPHANUMERICAL "-_") && filename_is_valid(tag);
}
int device_add_tag(sd_device *device, const char *tag, bool both) {
+3 -5
View File
@@ -2487,16 +2487,14 @@ static int udev_rule_apply_token_to_event(
if (token->op == OP_ASSIGN)
device_cleanup_tags(dev);
if (buf[strspn(buf, ALPHANUMERICAL "-_")] != '\0') {
log_event_error(dev, token, "Invalid tag name '%s', ignoring", buf);
break;
}
if (token->op == OP_REMOVE)
device_remove_tag(dev, buf);
else {
r = device_add_tag(dev, buf, true);
if (r == -ENOMEM)
return log_oom();
if (r < 0)
return log_event_error_errno(dev, token, r, "Failed to add tag '%s': %m", buf);
log_event_warning_errno(dev, token, r, "Failed to add tag '%s', ignoring: %m", buf);
}
break;
}