From 393fcaf733d8e50f18a70be7de1e088fb61f1ff4 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 14 Dec 2020 16:26:13 +0900 Subject: [PATCH] udev: move util_replace_chars() to udev-util.c --- src/libudev/libudev-util.c | 43 -------------------------------- src/libudev/libudev-util.h | 2 -- src/shared/udev-util.c | 45 ++++++++++++++++++++++++++++++++++ src/shared/udev-util.h | 1 + src/udev/ata_id/ata_id.c | 6 ++--- src/udev/scsi_id/scsi_id.c | 12 ++++----- src/udev/udev-builtin-usb_id.c | 14 +++++------ src/udev/udev-event.c | 2 +- src/udev/udev-event.h | 1 + src/udev/udev-rules.c | 8 +++--- 10 files changed, 68 insertions(+), 66 deletions(-) diff --git a/src/libudev/libudev-util.c b/src/libudev/libudev-util.c index f4f686fc88..8a6b56be5c 100644 --- a/src/libudev/libudev-util.c +++ b/src/libudev/libudev-util.c @@ -75,49 +75,6 @@ int util_resolve_subsys_kernel(const char *string, char *result, size_t maxsize, return 0; } -/* allow chars in allow list, plain ascii, hex-escaping and valid utf8 */ -size_t util_replace_chars(char *str, const char *allow) { - size_t i = 0, replaced = 0; - - assert(str); - - while (str[i] != '\0') { - int len; - - if (allow_listed_char_for_devnode(str[i], allow)) { - i++; - continue; - } - - /* accept hex encoding */ - if (str[i] == '\\' && str[i+1] == 'x') { - i += 2; - continue; - } - - /* accept valid utf8 */ - len = utf8_encoded_valid_unichar(str + i, (size_t) -1); - if (len > 1) { - i += len; - continue; - } - - /* if space is allowed, replace whitespace with ordinary space */ - if (isspace(str[i]) && allow && strchr(allow, ' ')) { - str[i] = ' '; - i++; - replaced++; - continue; - } - - /* everything else is replaced with '_' */ - str[i] = '_'; - i++; - replaced++; - } - return replaced; -} - /** * udev_util_encode_string: * @str: input string to be encoded diff --git a/src/libudev/libudev-util.h b/src/libudev/libudev-util.h index dd0561d90e..547981311e 100644 --- a/src/libudev/libudev-util.h +++ b/src/libudev/libudev-util.h @@ -9,8 +9,6 @@ #define UTIL_PATH_SIZE 1024 #define UTIL_NAME_SIZE 512 #define UTIL_LINE_SIZE 16384 -#define UDEV_ALLOWED_CHARS_INPUT "/ $%?," -size_t util_replace_chars(char *str, const char *white); int util_resolve_subsys_kernel(const char *string, char *result, size_t maxsize, bool read_value); /* Cleanup functions */ diff --git a/src/shared/udev-util.c b/src/shared/udev-util.c index 17b9ed137b..d03e4bbe6f 100644 --- a/src/shared/udev-util.c +++ b/src/shared/udev-util.c @@ -5,6 +5,7 @@ #include #include "alloc-util.h" +#include "device-nodes.h" #include "device-util.h" #include "env-file.h" #include "escape.h" @@ -426,3 +427,47 @@ size_t udev_replace_whitespace(const char *str, char *to, size_t len) { to[j] = '\0'; return j; } + +size_t udev_replace_chars(char *str, const char *allow) { + size_t i = 0, replaced = 0; + + assert(str); + + /* allow chars in allow list, plain ascii, hex-escaping and valid utf8. */ + + while (str[i] != '\0') { + int len; + + if (allow_listed_char_for_devnode(str[i], allow)) { + i++; + continue; + } + + /* accept hex encoding */ + if (str[i] == '\\' && str[i+1] == 'x') { + i += 2; + continue; + } + + /* accept valid utf8 */ + len = utf8_encoded_valid_unichar(str + i, (size_t) -1); + if (len > 1) { + i += len; + continue; + } + + /* if space is allowed, replace whitespace with ordinary space */ + if (isspace(str[i]) && allow && strchr(allow, ' ')) { + str[i] = ' '; + i++; + replaced++; + continue; + } + + /* everything else is replaced with '_' */ + str[i] = '_'; + i++; + replaced++; + } + return replaced; +} diff --git a/src/shared/udev-util.h b/src/shared/udev-util.h index d0ebbede41..f20e32b4d2 100644 --- a/src/shared/udev-util.h +++ b/src/shared/udev-util.h @@ -37,3 +37,4 @@ void log_device_uevent(sd_device *device, const char *str); int udev_rule_parse_value(char *str, char **ret_value, char **ret_endpos); size_t udev_replace_whitespace(const char *str, char *to, size_t len); +size_t udev_replace_chars(char *str, const char *allow); diff --git a/src/udev/ata_id/ata_id.c b/src/udev/ata_id/ata_id.c index 434b8765aa..9d22be81b2 100644 --- a/src/udev/ata_id/ata_id.c +++ b/src/udev/ata_id/ata_id.c @@ -485,11 +485,11 @@ int main(int argc, char *argv[]) { model[40] = '\0'; udev_util_encode_string(model, model_enc, sizeof(model_enc)); udev_replace_whitespace((char *) id.model, model, 40); - util_replace_chars(model, NULL); + udev_replace_chars(model, NULL); udev_replace_whitespace((char *) id.serial_no, serial, 20); - util_replace_chars(serial, NULL); + udev_replace_chars(serial, NULL); udev_replace_whitespace((char *) id.fw_rev, revision, 8); - util_replace_chars(revision, NULL); + udev_replace_chars(revision, NULL); if (export) { /* Set this to convey the disk speaks the ATA protocol */ diff --git a/src/udev/scsi_id/scsi_id.c b/src/udev/scsi_id/scsi_id.c index 162bd4e7df..5d61e38d5e 100644 --- a/src/udev/scsi_id/scsi_id.c +++ b/src/udev/scsi_id/scsi_id.c @@ -457,12 +457,12 @@ static int set_inq_values(struct scsi_id_device *dev_scsi, const char *path) { udev_util_encode_string(dev_scsi->model, model_enc_str, sizeof(model_enc_str)); udev_replace_whitespace(dev_scsi->vendor, vendor_str, sizeof(vendor_str)-1); - util_replace_chars(vendor_str, NULL); + udev_replace_chars(vendor_str, NULL); udev_replace_whitespace(dev_scsi->model, model_str, sizeof(model_str)-1); - util_replace_chars(model_str, NULL); + udev_replace_chars(model_str, NULL); set_type(dev_scsi->type, type_str, sizeof(type_str)); udev_replace_whitespace(dev_scsi->revision, revision_str, sizeof(revision_str)-1); - util_replace_chars(revision_str, NULL); + udev_replace_chars(revision_str, NULL); return 0; } @@ -503,10 +503,10 @@ static int scsi_id(char *maj_min_dev) { printf("ID_TYPE=%s\n", type_str); if (dev_scsi.serial[0] != '\0') { udev_replace_whitespace(dev_scsi.serial, serial_str, sizeof(serial_str)-1); - util_replace_chars(serial_str, NULL); + udev_replace_chars(serial_str, NULL); printf("ID_SERIAL=%s\n", serial_str); udev_replace_whitespace(dev_scsi.serial_short, serial_str, sizeof(serial_str)-1); - util_replace_chars(serial_str, NULL); + udev_replace_chars(serial_str, NULL); printf("ID_SERIAL_SHORT=%s\n", serial_str); } if (dev_scsi.wwn[0] != '\0') { @@ -533,7 +533,7 @@ static int scsi_id(char *maj_min_dev) { char serial_str[MAX_SERIAL_LEN]; udev_replace_whitespace(dev_scsi.serial, serial_str, sizeof(serial_str)-1); - util_replace_chars(serial_str, NULL); + udev_replace_chars(serial_str, NULL); printf("%s\n", serial_str); goto out; } diff --git a/src/udev/udev-builtin-usb_id.c b/src/udev/udev-builtin-usb_id.c index aa501a894e..b74f7c057a 100644 --- a/src/udev/udev-builtin-usb_id.c +++ b/src/udev/udev-builtin-usb_id.c @@ -331,7 +331,7 @@ static int builtin_usb_id(sd_device *dev, int argc, char *argv[], bool test) { } udev_util_encode_string(scsi_vendor, vendor_str_enc, sizeof(vendor_str_enc)); udev_replace_whitespace(scsi_vendor, vendor_str, sizeof(vendor_str)-1); - util_replace_chars(vendor_str, NULL); + udev_replace_chars(vendor_str, NULL); r = sd_device_get_sysattr_value(dev_scsi, "model", &scsi_model); if (r < 0) { @@ -340,7 +340,7 @@ static int builtin_usb_id(sd_device *dev, int argc, char *argv[], bool test) { } udev_util_encode_string(scsi_model, model_str_enc, sizeof(model_str_enc)); udev_replace_whitespace(scsi_model, model_str, sizeof(model_str)-1); - util_replace_chars(model_str, NULL); + udev_replace_chars(model_str, NULL); r = sd_device_get_sysattr_value(dev_scsi, "type", &scsi_type); if (r < 0) { @@ -355,7 +355,7 @@ static int builtin_usb_id(sd_device *dev, int argc, char *argv[], bool test) { goto fallback; } udev_replace_whitespace(scsi_rev, revision_str, sizeof(revision_str)-1); - util_replace_chars(revision_str, NULL); + udev_replace_chars(revision_str, NULL); /* * some broken devices have the same identifiers @@ -381,7 +381,7 @@ fallback: usb_vendor = vendor_id; udev_util_encode_string(usb_vendor, vendor_str_enc, sizeof(vendor_str_enc)); udev_replace_whitespace(usb_vendor, vendor_str, sizeof(vendor_str)-1); - util_replace_chars(vendor_str, NULL); + udev_replace_chars(vendor_str, NULL); } if (model_str[0] == '\0') { @@ -391,7 +391,7 @@ fallback: usb_model = product_id; udev_util_encode_string(usb_model, model_str_enc, sizeof(model_str_enc)); udev_replace_whitespace(usb_model, model_str, sizeof(model_str)-1); - util_replace_chars(model_str, NULL); + udev_replace_chars(model_str, NULL); } if (revision_str[0] == '\0') { @@ -399,7 +399,7 @@ fallback: if (sd_device_get_sysattr_value(dev_usb, "bcdDevice", &usb_rev) >= 0) { udev_replace_whitespace(usb_rev, revision_str, sizeof(revision_str)-1); - util_replace_chars(revision_str, NULL); + udev_replace_chars(revision_str, NULL); } } @@ -418,7 +418,7 @@ fallback: if (usb_serial) { udev_replace_whitespace(usb_serial, serial_str, sizeof(serial_str)-1); - util_replace_chars(serial_str, NULL); + udev_replace_chars(serial_str, NULL); } } } diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c index bc12e4df79..f5831ed28d 100644 --- a/src/udev/udev-event.c +++ b/src/udev/udev-event.c @@ -364,7 +364,7 @@ static ssize_t udev_event_subst_format( if (val != vbuf) strscpy(vbuf, sizeof(vbuf), val); delete_trailing_chars(vbuf, NULL); - count = util_replace_chars(vbuf, UDEV_ALLOWED_CHARS_INPUT); + count = udev_replace_chars(vbuf, UDEV_ALLOWED_CHARS_INPUT); if (count > 0) log_device_debug(dev, "%i character(s) replaced", count); l = strpcpy(&s, l, vbuf); diff --git a/src/udev/udev-event.h b/src/udev/udev-event.h index 27bf8f9372..ecbe957b4f 100644 --- a/src/udev/udev-event.h +++ b/src/udev/udev-event.h @@ -16,6 +16,7 @@ #define READ_END 0 #define WRITE_END 1 +#define UDEV_ALLOWED_CHARS_INPUT "/ $%?," typedef struct UdevEvent { sd_device *dev; diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c index 48fd33fded..7bfc25fdb5 100644 --- a/src/udev/udev-rules.c +++ b/src/udev/udev-rules.c @@ -1684,7 +1684,7 @@ static int udev_rule_apply_token_to_event( } delete_trailing_chars(result, "\n"); - count = util_replace_chars(result, UDEV_ALLOWED_CHARS_INPUT); + count = udev_replace_chars(result, UDEV_ALLOWED_CHARS_INPUT); if (count > 0) log_rule_debug(dev, rules, "Replaced %zu character(s) in result of \"%s\"", count, buf); @@ -2048,7 +2048,7 @@ static int udev_rule_apply_token_to_event( (void) udev_event_apply_format(event, token->value, buf, sizeof(buf), false); if (IN_SET(event->esc, ESCAPE_UNSET, ESCAPE_REPLACE)) { - count = util_replace_chars(buf, "/"); + count = udev_replace_chars(buf, "/"); if (count > 0) log_rule_debug(dev, rules, "Replaced %zu character(s) from result of NAME=\"%s\"", count, token->value); @@ -2082,9 +2082,9 @@ static int udev_rule_apply_token_to_event( /* allow multiple symlinks separated by spaces */ (void) udev_event_apply_format(event, token->value, buf, sizeof(buf), event->esc != ESCAPE_NONE); if (event->esc == ESCAPE_UNSET) - count = util_replace_chars(buf, "/ "); + count = udev_replace_chars(buf, "/ "); else if (event->esc == ESCAPE_REPLACE) - count = util_replace_chars(buf, "/"); + count = udev_replace_chars(buf, "/"); else count = 0; if (count > 0)