X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev_utils_string.c;h=38b91aa0bd030ae8f3abb6f4561ab4e5bcf08cf3;hb=05610c088ee9ea668d4750f69a35bf833a63616d;hp=b0641f002b01b2c1f676c41900518c27e447c5b5;hpb=c6594afda43575c740aedccef65491420ca3851e;p=elogind.git 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) {