You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by co...@apache.org on 2015/01/16 20:43:30 UTC

svn commit: r1652507 - in /httpd/httpd/trunk: CHANGES modules/mappers/mod_rewrite.c

Author: covener
Date: Fri Jan 16 19:43:30 2015
New Revision: 1652507

URL: http://svn.apache.org/r1652507
Log:
mod_rewrite: Improve 'bad flag delimeters' startup error by showing
how the input was tokenized.  PR 56528. 

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


Modified:
    httpd/httpd/trunk/CHANGES
    httpd/httpd/trunk/modules/mappers/mod_rewrite.c

Modified: httpd/httpd/trunk/CHANGES
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=1652507&r1=1652506&r2=1652507&view=diff
==============================================================================
--- httpd/httpd/trunk/CHANGES [utf-8] (original)
+++ httpd/httpd/trunk/CHANGES [utf-8] Fri Jan 16 19:43:30 2015
@@ -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]

Modified: httpd/httpd/trunk/modules/mappers/mod_rewrite.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/mappers/mod_rewrite.c?rev=1652507&r1=1652506&r2=1652507&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/mappers/mod_rewrite.c (original)
+++ httpd/httpd/trunk/modules/mappers/mod_rewrite.c Fri Jan 16 19:43:30 2015
@@ -2680,7 +2680,7 @@ static apr_status_t rewritelock_remove(v
  * 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
     }
 
     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
 
     if (!*str) {
         *a3 = NULL; /* 3rd argument is optional */
-        return 0;
+        return NULL;
     }
     *str++ = '\0';
 
@@ -2741,7 +2741,7 @@ static int parseargline(char *str, char
 
     if (!*str) {
         *a3 = NULL; /* 3rd argument is still optional */
-        return 0;
+        return NULL;
     }
 
     /*
@@ -2760,7 +2760,17 @@ static int parseargline(char *str, char
     }
     *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(ap
     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_p
      * 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_p
     }
 
     /*  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 */