vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sun Jul 8 17:20:50 2018 +0300| [3ae477f9c998b0e4f2f6f99830aba2f8d3811ddd] | committer: Rémi Denis-Courmont
uri: try to encode brackets in fix-up (fixes #19594) > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=3ae477f9c998b0e4f2f6f99830aba2f8d3811ddd --- src/text/url.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/src/text/url.c b/src/text/url.c index 6089c6802d..1b7d50fb61 100644 --- a/src/text/url.c +++ b/src/text/url.c @@ -863,15 +863,67 @@ static char *vlc_uri_fixup_inner(const char *str, const char *extras) return stream.ptr; } +static void vlc_uri_putc(struct vlc_memstream *s, int c, const char *extras) +{ + if (isurisafe(c) || isurisubdelim(c) || (strchr(extras, c) != NULL)) + vlc_memstream_putc(s, c); + else + vlc_memstream_printf(s, "%%%02hhX", c); +} + char *vlc_uri_fixup(const char *str) { - static const char extras[] = ":/?#[]@"; + assert(str != NULL); + + /* If percent sign is consistently followed by two hexadecimal digits, + * then URL encoding must be assumed. + * Otherwise, the percent sign itself must be URL-encoded. + */ + bool encode_percent = false; + + for (const char *p = str; *p != '\0'; p++) + if (p[0] == '%' && !(isurihex(p[1]) && isurihex(p[2]))) + { + encode_percent = true; + break; + } + + struct vlc_memstream stream; + vlc_memstream_open(&stream); + + /* Handle URI scheme */ + const char *p = str; + bool absolute = false; + bool encode_brackets = true; + + while (isurialnum(*p) || memchr("+-.", *p, 3) != NULL) + vlc_memstream_putc(&stream, *(p++)); + + if (p > str && *p == ':') + { /* There is an URI scheme, assume an absolute URI. */ + vlc_memstream_putc(&stream, *(p++)); + absolute = true; + encode_brackets = false; + } + + /* Handle URI authority */ + if ((absolute || p == str) && strncmp(p, "//", 2) == 0) + { + vlc_memstream_write(&stream, p, 2); + p += 2; + encode_brackets = true; + + while (memchr("/?#", *p, 4) == NULL) + vlc_uri_putc(&stream, *(p++), "%:[]@" + encode_percent); + } + + /* Handle URI path and what follows */ + const char *extras = encode_brackets ? "%/?#@" : "%:/?#[]@"; - /* Rule number one is do not change a (potentially) valid URI */ - if (vlc_uri_component_validate(str, extras)) - return strdup(str); + while (*p != '\0') + vlc_uri_putc(&stream, *(p++), extras + encode_percent); - return vlc_uri_fixup_inner(str, extras); + return vlc_memstream_close(&stream) ? NULL : stream.ptr; } #if defined (HAVE_IDN) _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
