]> granicus.if.org Git - apache/commitdiff
mod_rewrite: Improve 'bad flag delimeters' startup error by showing
authorEric Covener <covener@apache.org>
Fri, 16 Jan 2015 19:43:30 +0000 (19:43 +0000)
committerEric Covener <covener@apache.org>
Fri, 16 Jan 2015 19:43:30 +0000 (19:43 +0000)
how the input was tokenized.  PR 56528.

Submitted By: Edward Lu <Chaosed0 gmail.com>
Committed By: covener

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1652507 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/mappers/mod_rewrite.c

diff --git a/CHANGES b/CHANGES
index 4524b7683b31a5ae5279a1ea3b584e6857fb5259..59eda117c2e2a393815311693106f1a35c468dfb 100644 (file)
--- 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 <Chaosed0 gmail.com>]
+
   *) 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]
index 64c287c3c3d9d742ed1c58ebe935659229d08d93..cc60b5edd40178bf55e1e75214183d86533bfe0b 100644 (file)
@@ -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 */