From: Eric Covener Date: Fri, 16 Jan 2015 19:43:30 +0000 (+0000) Subject: mod_rewrite: Improve 'bad flag delimeters' startup error by showing X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5648b8907e6ed3f088937bafe2b291d9996bcd61;p=thirdparty%2Fapache%2Fhttpd.git mod_rewrite: Improve 'bad flag delimeters' startup error by showing how the input was tokenized. PR 56528. Submitted By: Edward Lu Committed By: covener git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1652507 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 4524b7683b3..59eda117c2e 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ -*- coding: utf-8 -*- Changes with Apache 2.5.0 + *) mod_rewrite: Improve 'bad flag delimeters' startup error by showing + how the input was tokenized. PR 56528. [Edward Lu ] + *) mod_ssl: Add support for extracting subjectAltName entries of type rfc822Name and dNSName into SSL_{CLIENT,SERVER}_SAN_{Email,DNS}_n environment variables. Also addresses PR 57207. [Kaspar Brand] diff --git a/modules/mappers/mod_rewrite.c b/modules/mappers/mod_rewrite.c index 64c287c3c3d..cc60b5edd40 100644 --- a/modules/mappers/mod_rewrite.c +++ b/modules/mappers/mod_rewrite.c @@ -2680,7 +2680,7 @@ static apr_status_t rewritelock_remove(void *data) * XXX: what an inclined parser. Seems we have to leave it so * for backwards compat. *sigh* */ -static int parseargline(char *str, char **a1, char **a2, char **a3) +static char *parseargline(apr_pool_t *p, char *str, char **a1, char **a2, char **a3) { char quote; @@ -2705,7 +2705,7 @@ static int parseargline(char *str, char **a1, char **a2, char **a3) } if (!*str) { - return 1; + return "bad argument line: at least two arguments required"; } *str++ = '\0'; @@ -2731,7 +2731,7 @@ static int parseargline(char *str, char **a1, char **a2, char **a3) if (!*str) { *a3 = NULL; /* 3rd argument is optional */ - return 0; + return NULL; } *str++ = '\0'; @@ -2741,7 +2741,7 @@ static int parseargline(char *str, char **a1, char **a2, char **a3) if (!*str) { *a3 = NULL; /* 3rd argument is still optional */ - return 0; + return NULL; } /* @@ -2760,7 +2760,17 @@ static int parseargline(char *str, char **a1, char **a2, char **a3) } *str = '\0'; - return 0; + if (**a3 != '[') { + return apr_psprintf(p, "bad flag delimiters: third argument must begin " + "with '[' but found '%c' - too many arguments or rogue " + "whitespace?", **a3); + } + else if ((*a3)[strlen(*a3)-1] != ']') { + return apr_psprintf(p, "bad flag delimiters: third argument must end " + "with ']' but found '%c' - unintended whitespace within the " + "flags definition?", (*a3)[strlen(*a3)-1]); + } + return NULL; } static void *config_server_create(apr_pool_t *p, server_rec *s) @@ -3185,6 +3195,7 @@ static const char *cmd_parseflagfield(apr_pool_t *p, void *cfg, char *key, const char *err; endp = key + strlen(key) - 1; + /* This should have been checked before, but just in case... */ if (*key != '[' || *endp != ']') { return "bad flag delimiters"; } @@ -3282,9 +3293,10 @@ static const char *cmd_rewritecond(cmd_parms *cmd, void *in_dconf, * of the argument line. So we can use a1 .. a3 without * copying them again. */ - if (parseargline(str, &a1, &a2, &a3)) { - return apr_pstrcat(cmd->pool, "RewriteCond: bad argument line '", str, - "'", NULL); + if ((err = parseargline(cmd->pool, str, &a1, &a2, &a3))) { + return apr_psprintf(cmd->pool, "RewriteCond: %s " + "(TestString=%s, CondPattern=%s, flags=%s)", + err, a1, a2, a3); } /* arg1: the input string */ @@ -3703,9 +3715,10 @@ static const char *cmd_rewriterule(cmd_parms *cmd, void *in_dconf, } /* parse the argument line ourself */ - if (parseargline(str, &a1, &a2, &a3)) { - return apr_pstrcat(cmd->pool, "RewriteRule: bad argument line '", str, - "'", NULL); + if ((err = parseargline(cmd->pool, str, &a1, &a2, &a3))) { + return apr_psprintf(cmd->pool, "RewriteRule: %s " + "(pattern='%s', substitution='%s', flags='%s')", + err, a1, a2, a3); } /* arg3: optional flags field */