X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuhttpd.git;a=blobdiff_plain;f=utils.c;h=d990d7dfd2bee38ac13db87ddffb452a14836e0f;hp=29e03c0b9a3fc83e9b41604a545cf52ec42b35e0;hb=HEAD;hpb=7ed2edc40dd6d0171266f3bfbc96466e1d25e3cd diff --git a/utils.c b/utils.c index 29e03c0..d990d7d 100644 --- a/utils.c +++ b/utils.c @@ -208,6 +208,10 @@ bool uh_path_match(const char *prefix, const char *url) { int len = strlen(prefix); + /* A prefix of "/" will - by definition - match any url */ + if (prefix[0] == '/' && len == 1) + return true; + if (strncmp(url, prefix, len) != 0) return false; @@ -245,3 +249,45 @@ bool uh_addr_rfc1918(struct uh_addr *addr) return 0; } + + +static bool is_html_special_char(char c) +{ + switch (c) + { + case 0x22: + case 0x26: + case 0x27: + case 0x3C: + case 0x3E: + return true; + + default: + return false; + } +} + +char *uh_htmlescape(const char *str) +{ + size_t i, len; + char *p, *copy; + + for (i = 0, len = 1; str[i]; i++) + if (is_html_special_char(str[i])) + len += 6; /* &#x??; */ + else + len++; + + copy = calloc(1, len); + + if (!copy) + return NULL; + + for (i = 0, p = copy; str[i]; i++) + if (is_html_special_char(str[i])) + p += sprintf(p, "&#x%02x;", (unsigned int)str[i]); + else + *p++ = str[i]; + + return copy; +}