1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-10-30 23:21:08 +03:00

udev_db: escape path names with \x00 instead of %00

This commit is contained in:
Kay Sievers 2007-05-16 19:51:13 +02:00
parent c6594afda4
commit 05610c088e
3 changed files with 19 additions and 19 deletions

2
udev.h
View File

@ -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

View File

@ -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];

View File

@ -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) {