From b4167b174b4eeebceaf80e240635e601f0a9860c Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Sun, 8 May 2016 23:12:07 +0200 Subject: [PATCH] uri-util: Reworked URI scheme parsing. Made uri_cut_scheme() use uri_parse_scheme() internally rather than the other way around. --- src/lib-http/http-url.c | 6 ++--- src/lib-imap/imap-url.c | 6 ++--- src/lib/uri-util.c | 50 ++++++++++++++++++++--------------------- 3 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/lib-http/http-url.c b/src/lib-http/http-url.c index e3f645cbe5..e4b76619b9 100644 --- a/src/lib-http/http-url.c +++ b/src/lib-http/http-url.c @@ -164,9 +164,9 @@ static bool http_url_do_parse(struct http_url_parser *url_parser) if ((url_parser->flags & HTTP_URL_PARSE_SCHEME_EXTERNAL) == 0) { const char *scheme; - if ((ret = uri_parse_scheme(parser, &scheme)) < 0) - return FALSE; - else if (ret > 0) { + if ((ret = uri_parse_scheme(parser, &scheme)) <= 0) { + parser->cur = parser->begin; + } else { if (strcasecmp(scheme, "https") == 0) { if (url != NULL) url->have_ssl = TRUE; diff --git a/src/lib-imap/imap-url.c b/src/lib-imap/imap-url.c index 8820279007..670b602009 100644 --- a/src/lib-imap/imap-url.c +++ b/src/lib-imap/imap-url.c @@ -795,9 +795,9 @@ static bool imap_url_do_parse(struct imap_url_parser *url_parser) if ((url_parser->flags & IMAP_URL_PARSE_SCHEME_EXTERNAL) == 0) { const char *scheme; - if ((ret = uri_parse_scheme(parser, &scheme)) < 0) - return FALSE; - else if (ret > 0) { + if (uri_parse_scheme(parser, &scheme) <= 0) { + parser->cur = parser->begin; + } else { if (strcasecmp(scheme, "imap") != 0) { parser->error = "Not an IMAP URL"; return FALSE; diff --git a/src/lib/uri-util.c b/src/lib/uri-util.c index c461c1df8f..9f1f50f48e 100644 --- a/src/lib/uri-util.c +++ b/src/lib/uri-util.c @@ -277,50 +277,48 @@ bool uri_data_decode(struct uri_parser *parser, const char *data, return TRUE; } -int uri_cut_scheme(const char **uri_p, const char **scheme_r) +int uri_parse_scheme(struct uri_parser *parser, const char **scheme_r) { - const char *p = *uri_p; + const unsigned char *first = parser->cur; size_t len = 1; /* RFC 3968: * scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) */ - if (!i_isalpha(*p)) - return -1; - p++; + if (parser->cur >= parser->end || !i_isalpha(*parser->cur)) + return 0; + parser->cur++; - while (len < URI_MAX_SCHEME_NAME_LEN && *p != '\0') { - if (!i_isalnum(*p) && *p != '+' && *p != '-' && *p != '.') + while (len < URI_MAX_SCHEME_NAME_LEN && + parser->cur < parser->end) { + if (!i_isalnum(*parser->cur) && + *parser->cur != '+' && *parser->cur != '-' && + *parser->cur != '.') break; - p++; + parser->cur++; len++; } - if (*p != ':') + if (parser->cur >= parser->end || *parser->cur != ':') { + parser->error = "Invalid URI scheme"; return -1; - + } if (scheme_r != NULL) - *scheme_r = t_strdup_until(*uri_p, p); - *uri_p = p + 1; - return 0; + *scheme_r = t_strndup(first, parser->cur - first); + parser->cur++; + return 1; } -int uri_parse_scheme(struct uri_parser *parser, const char **scheme_r) +int uri_cut_scheme(const char **uri_p, const char **scheme_r) { - const char *p; - - if (parser->cur >= parser->end) - return 0; + struct uri_parser parser; - p = (const char *)parser->cur; - if (uri_cut_scheme(&p, scheme_r) < 0) - return 0; - - parser->cur = (const unsigned char *)p; - if (!parser->pool->datastack_pool) - *scheme_r = p_strdup(parser->pool, *scheme_r); - return 1; + uri_parser_init(&parser, NULL, *uri_p); + if (uri_parse_scheme(&parser, scheme_r) <= 0) + return -1; + *uri_p = (const char *)parser.cur; + return 0; } static int