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