src/server/util/util.c

changeset 59
ab25c0a231d0
parent 58
66c22e54aa90
child 62
c47e081b6c0f
--- a/src/server/util/util.c	Tue Mar 19 17:38:32 2013 +0100
+++ b/src/server/util/util.c	Mon May 06 13:44:27 2013 +0200
@@ -192,6 +192,32 @@
     return 500;
 }
 
+NSAPI_PUBLIC int util_uri_unescape_strict(char *s)
+{
+    char *t, *u, t1, t2;
+    int rv = 1;
+
+    for(t = s, u = s; *t; ++t, ++u) {
+        if (*t == '%') {
+            t1 = t[1] & 0xdf; /* [a-f] -> [A-F] */
+            if ((t1 < 'A' || t1 > 'F') && (t[1] < '0' || t[1] > '9'))
+                rv = 0;
+
+            t2 = t[2] & 0xdf; /* [a-f] -> [A-F] */
+            if ((t2 < 'A' || t2 > 'F') && (t[2] < '0' || t[2] > '9'))
+                rv = 0;
+
+            *u = ((t[1] >= 'A' ? ((t[1] & 0xdf) - 'A')+10 : (t[1] - '0'))*16) +
+                  (t[2] >= 'A' ? ((t[2] & 0xdf) - 'A')+10 : (t[2] - '0'));
+            t += 2;
+        }
+        else if (u != t)
+            *u = *t;
+    }
+    *u = *t;
+
+    return rv;
+}
 
 NSAPI_PUBLIC
 sstr_t util_path_append(pool_handle_t *pool, char *path, char *ch) {
@@ -211,6 +237,7 @@
     newstr.ptr = pool_malloc(pool, newstr.length + 1);
     if(!newstr.ptr) {
         // TODO: error
+        newstr.length = 0;
         return newstr;
     }
     if(s.length == 1) {

mercurial