mirror of
https://github.com/systemd/systemd.git
synced 2024-12-26 03:22:00 +03:00
udev_db: escape path names with \x00 instead of %00
This commit is contained in:
parent
c6594afda4
commit
05610c088e
2
udev.h
2
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
|
||||
|
11
udev_rules.c
11
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];
|
||||
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user