Mercurial > dovecot > core-2.2
changeset 20862:c7ce2b87fc92
Revert "lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components."
This reverts commit 5b6dc4c53617362baf8713815621bebbeb38c8cc.
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Fri, 14 Oct 2016 09:45:09 +0300 |
parents | ddae63d7bc9c |
children | 3c79371d020b |
files | src/lib/uri-util.c |
diffstat | 1 files changed, 36 insertions(+), 48 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/uri-util.c Wed May 18 17:45:09 2016 +0300 +++ b/src/lib/uri-util.c Fri Oct 14 09:45:09 2016 +0300 @@ -589,37 +589,33 @@ int uri_parse_path_segment(struct uri_parser *parser, const char **segment_r) { - const unsigned char *first = parser->cur; - int ret; + const unsigned char *p = parser->cur; - while (parser->cur < parser->end) { - if (*parser->cur == '%') { - unsigned char ch = 0; - if ((ret=uri_parse_pct_encoded(parser, &ch)) < 0) - return -1; - if (ret > 0) - continue; + while (p < parser->end) { + if (*p == '%') { + p++; + continue; } - if ((*parser->cur & 0x80) != 0 || - (_uri_char_lookup[*parser->cur] & CHAR_MASK_PCHAR) == 0) + if ((*p & 0x80) != 0 || (_uri_char_lookup[*p] & CHAR_MASK_PCHAR) == 0) break; - parser->cur++; + p++; } - if (parser->cur < parser->end && - *parser->cur != '/' && *parser->cur != '?' && *parser->cur != '#' ) { + if (p < parser->end && + *p != '/' && *p != '?' && *p != '#' ) { parser->error = "Path component contains invalid character"; return -1; } - if (first == parser->cur) + if (p == parser->cur) return 0; if (segment_r != NULL) - *segment_r = p_strdup_until(parser->pool, first, parser->cur); + *segment_r = p_strdup_until(parser->pool, parser->cur, p); + parser->cur = p; return 1; } @@ -724,8 +720,7 @@ int uri_parse_query(struct uri_parser *parser, const char **query_r) { - const unsigned char *first = parser->cur; - int ret; + const unsigned char *p = parser->cur; /* RFC 3986: * @@ -733,39 +728,35 @@ * query = *( pchar / "/" / "?" ) * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" */ - if (parser->cur >= parser->end || *parser->cur != '?') + if (p >= parser->end || *p != '?') return 0; - parser->cur++; + p++; - while (parser->cur < parser->end) { - if (*parser->cur == '%') { - unsigned char ch = 0; - if ((ret=uri_parse_pct_encoded(parser, &ch)) < 0) - return -1; - if (ret > 0) - continue; + while (p < parser->end) { + if (*p == '%') { + p++; + continue; } - if ((*parser->cur & 0x80) != 0 || - (_uri_char_lookup[*parser->cur] & CHAR_MASK_QCHAR) == 0) + if ((*p & 0x80) != 0 || (_uri_char_lookup[*p] & CHAR_MASK_QCHAR) == 0) break; - parser->cur++; + p++; } - if (parser->cur < parser->end && *parser->cur != '#') { + if (p < parser->end && *p != '#') { parser->error = "Query component contains invalid character"; return -1; } if (query_r != NULL) - *query_r = p_strdup_until(parser->pool, first+1, parser->cur); + *query_r = p_strdup_until(parser->pool, parser->cur+1, p); + parser->cur = p; return 1; } int uri_parse_fragment(struct uri_parser *parser, const char **fragment_r) { - const unsigned char *first = parser->cur; - int ret; + const unsigned char *p = parser->cur; /* RFC 3986: * @@ -774,32 +765,29 @@ * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" */ - if (parser->cur >= parser->end || *parser->cur != '#') + if (p >= parser->end || *p != '#') return 0; - parser->cur++; + p++; - while (parser->cur < parser->end) { - if (*parser->cur == '%') { - unsigned char ch = 0; - if ((ret=uri_parse_pct_encoded(parser, &ch)) < 0) - return -1; - if (ret > 0) - continue; + while (p < parser->end) { + if (*p == '%') { + p++; + continue; } - if ((*parser->cur & 0x80) != 0 || - (_uri_char_lookup[*parser->cur] & CHAR_MASK_QCHAR) == 0) + if ((*p & 0x80) != 0 || (_uri_char_lookup[*p] & CHAR_MASK_QCHAR) == 0) break; - parser->cur++; + p++; } - if (parser->cur < parser->end) { + if (p < parser->end) { parser->error = "Fragment component contains invalid character"; return -1; } if (fragment_r != NULL) - *fragment_r = p_strdup_until(parser->pool, first+1, parser->cur); + *fragment_r = p_strdup_until(parser->pool, parser->cur+1, p); + parser->cur = p; return 1; }