]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
uri-util: Reworked URI scheme parsing.
authorStephan Bosch <stephan@rename-it.nl>
Sun, 8 May 2016 21:12:07 +0000 (23:12 +0200)
committerGitLab <gitlab@git.dovecot.net>
Mon, 16 May 2016 07:36:48 +0000 (10:36 +0300)
Made uri_cut_scheme() use uri_parse_scheme() internally rather than the other way around.

src/lib-http/http-url.c
src/lib-imap/imap-url.c
src/lib/uri-util.c

index e3f645cbe5cf5a06cf665da64f043a463ec28065..e4b76619b9b02b9b2229e45cd330824e80fc8be0 100644 (file)
@@ -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;
index 8820279007a31e74b59604678caa9bf4f1899404..670b6020091d5d6b573ce62031a56a00282aa917 100644 (file)
@@ -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;
index c461c1df8ffc68da446ca844a1a48502df9cb70c..9f1f50f48ef3b2ffb435ab118f50ad2a380caf73 100644 (file)
@@ -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