httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From s.@apache.org
Subject svn commit: r1198988 - in /httpd/httpd/trunk/modules: mappers/mod_alias.c proxy/mod_proxy.c
Date Mon, 07 Nov 2011 22:58:52 GMT
Author: sf
Date: Mon Nov  7 22:58:52 2011
New Revision: 1198988

URL: http://svn.apache.org/viewvc?rev=1198988&view=rev
Log:
More error checking for ap_pregsub

Modified:
    httpd/httpd/trunk/modules/mappers/mod_alias.c
    httpd/httpd/trunk/modules/proxy/mod_proxy.c

Modified: httpd/httpd/trunk/modules/mappers/mod_alias.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/mappers/mod_alias.c?rev=1198988&r1=1198987&r2=1198988&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/mappers/mod_alias.c (original)
+++ httpd/httpd/trunk/modules/mappers/mod_alias.c Mon Nov  7 22:58:52 2011
@@ -333,6 +333,9 @@ static int alias_matches(const char *uri
     return urip - uri;
 }
 
+static char magic_error_value;
+#define PREGSUB_ERROR      (&magic_error_value)
+
 static char *try_alias_list(request_rec *r, apr_array_header_t *aliases,
                             int is_redir, int *status)
 {
@@ -379,6 +382,12 @@ static char *try_alias_list(request_rec 
                                                               pathlen));
                        }
                     }
+                    else {
+                        ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+                                      "Regex substitution in '%s' failed. "
+                                      "Replacement too long?", alias->real);
+                        return PREGSUB_ERROR;
+                    }
                 }
                 else {
                     /* need something non-null */
@@ -438,6 +447,8 @@ static int translate_alias_redir(request
     }
 
     if ((ret = try_alias_list(r, serverconf->redirects, 1, &status)) != NULL) {
+        if (ret == PREGSUB_ERROR)
+            return HTTP_INTERNAL_SERVER_ERROR;
         if (ap_is_HTTP_REDIRECT(status)) {
             if (ret[0] == '/') {
                 char *orig_target = ret;
@@ -487,6 +498,8 @@ static int fixup_redir(request_rec *r)
     /* It may have changed since last time, so try again */
 
     if ((ret = try_alias_list(r, dirconf->redirects, 1, &status)) != NULL) {
+        if (ret == PREGSUB_ERROR)
+            return HTTP_INTERNAL_SERVER_ERROR;
         if (ap_is_HTTP_REDIRECT(status)) {
             if (ret[0] == '/') {
                 char *orig_target = ret;

Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.c?rev=1198988&r1=1198987&r2=1198988&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy.c Mon Nov  7 22:58:52 2011
@@ -576,6 +576,13 @@ PROXY_DECLARE(int) ap_proxy_trans_match(
             }
             found = ap_pregsub(r->pool, real, use_uri, AP_MAX_REG_MATCH,
                     (use_uri == r->uri) ? regm : reg1);
+            if (!found) {
+                ap_log_rerror(APLOG_MARK, APLOG_CRIT, 0, r,
+                              "Substitution in regular expression failed. "
+                              "Replacement too long?");
+                return HTTP_INTERNAL_SERVER_ERROR;
+            }
+
             /* Note: The strcmp() below catches cases where there
              * was no regex substitution. This is so cases like:
              *
@@ -589,7 +596,7 @@ PROXY_DECLARE(int) ap_proxy_trans_match(
              *
              * which may be confusing.
              */
-            if (found && strcmp(found, real)) {
+            if (strcmp(found, real) != 0) {
                 found = apr_pstrcat(r->pool, "proxy:", found, NULL);
             }
             else {



Mime
View raw message