From: Kay Sievers Date: Wed, 16 May 2007 17:51:13 +0000 (+0200) Subject: udev_db: escape path names with \x00 instead of %00 X-Git-Tag: 174~1947 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=05610c088ee9ea668d4750f69a35bf833a63616d;ds=sidebyside udev_db: escape path names with \x00 instead of %00 --- diff --git a/udev.h b/udev.h index 6ef95133d..bb018ba19 100644 --- a/udev.h +++ b/udev.h @@ -31,7 +31,7 @@ #define COMMENT_CHARACTER '#' #define LINE_SIZE 512 #define PATH_SIZE 512 -#define NAME_SIZE 128 +#define NAME_SIZE 256 #define VALUE_SIZE 128 #define DEFAULT_PARTITIONS_COUNT 15 diff --git a/udev_rules.c b/udev_rules.c index 5c3d7d5d0..edfe3fd94 100644 --- a/udev_rules.c +++ b/udev_rules.c @@ -79,14 +79,9 @@ static int get_key(char **line, char **key, char **value) char *temp; linepos = *line; - if (!linepos) + if (linepos == NULL) return -1; - if (strchr(linepos, '\\')) { - dbg("escaped characters are not supported, skip"); - return -1; - } - /* skip whitespace */ while (isspace(linepos[0])) linepos++; @@ -217,7 +212,7 @@ static int import_file_into_env(struct udevice *udev, const char *filename) static int import_program_into_env(struct udevice *udev, const char *program) { - char result[1024]; + char result[2048]; size_t reslen; if (run_program(program, udev->dev->subsystem, result, sizeof(result), &reslen, (udev_log_priority >= LOG_INFO)) != 0) @@ -851,7 +846,7 @@ try_parent: } } - /* if we have ATTR assignements write value to sysfs file */ + /* if we have ATTR assignments, write value to sysfs file */ for (i = 0; i < rule->attr.count; i++) { struct key_pair *pair = &rule->attr.keys[i]; diff --git a/udev_utils_string.c b/udev_utils_string.c index b0641f002..38b91aa0b 100644 --- a/udev_utils_string.c +++ b/udev_utils_string.c @@ -58,11 +58,11 @@ size_t path_encode(char *s, size_t len) t[0] = '\0'; for (i = 0, j = 0; s[i] != '\0'; i++) { if (s[i] == '/') { - memcpy(&t[j], "%2f", 3); - j += 3; - } else if (s[i] == '%') { - memcpy(&t[j], "%25", 3); - j += 3; + memcpy(&t[j], "\\x2f", 4); + j += 4; + } else if (s[i] == '\\') { + memcpy(&t[j], "\\x5c", 4); + j += 4; } else { t[j] = s[i]; j++; @@ -78,12 +78,12 @@ size_t path_decode(char *s) size_t i, j; for (i = 0, j = 0; s[i] != '\0'; j++) { - if (memcmp(&s[i], "%2f", 3) == 0) { + if (memcmp(&s[i], "\\x2f", 4) == 0) { s[j] = '/'; - i += 3; - }else if (memcmp(&s[i], "%25", 3) == 0) { - s[j] = '%'; - i += 3; + i += 4; + }else if (memcmp(&s[i], "\\x5c", 4) == 0) { + s[j] = '\\'; + i += 4; } else { s[j] = s[i]; i++; @@ -233,6 +233,11 @@ int replace_untrusted_chars(char *str) i++; continue; } + /* hex encoding */ + if (str[i] == '\\' && str[i+1] == 'x') { + i += 2; + continue; + } /* valid utf8 is accepted */ len = utf8_encoded_valid_unichar(&str[i]); if (len > 1) {