chiark / gitweb /
udev_db: escape path names with \x00 instead of %00
authorKay Sievers <kay.sievers@vrfy.org>
Wed, 16 May 2007 17:51:13 +0000 (19:51 +0200)
committerKay Sievers <kay.sievers@vrfy.org>
Wed, 16 May 2007 17:51:13 +0000 (19:51 +0200)
udev.h
udev_rules.c
udev_utils_string.c

diff --git a/udev.h b/udev.h
index 6ef95133d57e7f33f8f1845ca2c19388d0a23d2b..bb018ba1958215d72b5c0c007f631a5965a2eb3a 100644 (file)
--- a/udev.h
+++ b/udev.h
@@ -31,7 +31,7 @@
 #define COMMENT_CHARACTER                      '#'
 #define LINE_SIZE                              512
 #define PATH_SIZE                              512
 #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
 #define VALUE_SIZE                             128
 
 #define DEFAULT_PARTITIONS_COUNT               15
index 5c3d7d5d0646a81d98507a5124d5efde603cf5dd..edfe3fd94cb0102e8701c6f05cba23da7da70d07 100644 (file)
@@ -79,14 +79,9 @@ static int get_key(char **line, char **key, char **value)
        char *temp;
 
        linepos = *line;
        char *temp;
 
        linepos = *line;
-       if (!linepos)
+       if (linepos == NULL)
                return -1;
 
                return -1;
 
-       if (strchr(linepos, '\\')) {
-               dbg("escaped characters are not supported, skip");
-               return -1;
-       }
-
        /* skip whitespace */
        while (isspace(linepos[0]))
                linepos++;
        /* 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)
 {
 
 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)
        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];
 
        for (i = 0; i < rule->attr.count; i++) {
                struct key_pair *pair = &rule->attr.keys[i];
 
index b0641f002b01b2c1f676c41900518c27e447c5b5..38b91aa0bd030ae8f3abb6f4561ab4e5bcf08cf3 100644 (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] == '/') {
        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++;
                } 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++) {
        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] = '/';
                        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++;
                } else {
                        s[j] = s[i];
                        i++;
@@ -233,6 +233,11 @@ int replace_untrusted_chars(char *str)
                        i++;
                        continue;
                }
                        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) {
                /* valid utf8 is accepted */
                len = utf8_encoded_valid_unichar(&str[i]);
                if (len > 1) {