You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ji...@apache.org on 2007/08/03 14:44:04 UTC

svn commit: r562441 - in /httpd/httpd/branches/2.2.x: STATUS modules/filters/mod_filter.c

Author: jim
Date: Fri Aug  3 05:44:03 2007
New Revision: 562441

URL: http://svn.apache.org/viewvc?view=rev&rev=562441
Log:
Merge r559804 from trunk:

mod_filter: fix merging of ! and =
PR: 42186 - patch by Issac Goldstand

Submitted by: niq
Reviewed by: jim

Modified:
    httpd/httpd/branches/2.2.x/STATUS
    httpd/httpd/branches/2.2.x/modules/filters/mod_filter.c

Modified: httpd/httpd/branches/2.2.x/STATUS
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/STATUS?view=diff&rev=562441&r1=562440&r2=562441
==============================================================================
--- httpd/httpd/branches/2.2.x/STATUS (original)
+++ httpd/httpd/branches/2.2.x/STATUS Fri Aug  3 05:44:03 2007
@@ -77,12 +77,6 @@
 PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
   [ start all new proposals below, under PATCHES PROPOSED. ]
 
-    * mod_filter: fix merging of ! and = in FilterChain
-      PR: 42186 - patch by Issac Goldstand
-      http://svn.apache.org/viewvc?view=rev&revision=559804
-      http://svn.apache.org/viewvc?view=rev&revision=559840 (CHANGES)
-      +1: niq, rpluem, jim
-
     * mod_filter: fix integer comparisons
       PR: 41835
       http://svn.apache.org/viewvc?view=rev&revision=559837

Modified: httpd/httpd/branches/2.2.x/modules/filters/mod_filter.c
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/modules/filters/mod_filter.c?view=diff&rev=562441&r1=562440&r2=562441
==============================================================================
--- httpd/httpd/branches/2.2.x/modules/filters/mod_filter.c (original)
+++ httpd/httpd/branches/2.2.x/modules/filters/mod_filter.c Fri Aug  3 05:44:03 2007
@@ -688,12 +688,20 @@
         break;
 
     case '!':        /* Empty the chain */
-        cfg->chain = NULL;
+                     /** IG: Add a NULL provider to the beginning so that 
+                      *  we can ensure that we'll empty everything before 
+                      *  this when doing config merges later */
+        p = apr_pcalloc(cmd->pool, sizeof(mod_filter_chain));
+        p->fname = NULL;
+        cfg->chain = p;
         break;
 
     case '=':        /* initialise chain with this arg */
+                     /** IG: Prepend a NULL provider to the beginning as above */
         p = apr_pcalloc(cmd->pool, sizeof(mod_filter_chain));
-        p->fname = arg+1;
+        p->fname = NULL;
+        p->next = apr_pcalloc(cmd->pool, sizeof(mod_filter_chain));
+        p->next->fname = arg+1;
         cfg->chain = p;
         break;
 
@@ -739,6 +747,14 @@
     ap_set_module_config(r->request_config, &filter_module, ctx);
 #endif
 
+    /** IG: Now that we've merged to the final config, go one last time
+     *  through the chain, and prune out the NULL filters */
+
+    for (p = cfg->chain; p; p = p->next) {
+        if (p->fname == NULL) 
+            cfg->chain = p->next;
+    }
+
     for (p = cfg->chain; p; p = p->next) {
         filter = apr_hash_get(cfg->live_filters, p->fname, APR_HASH_KEY_STRING);
         if (filter == NULL) {
@@ -788,7 +804,10 @@
     if (base->chain && add->chain) {
         for (p = base->chain; p; p = p->next) {
             newlink = apr_pmemdup(pool, p, sizeof(mod_filter_chain));
-            if (savelink) {
+            if (newlink->fname == NULL) {
+                conf->chain = savelink = newlink;
+            }
+            else if (savelink) {
                 savelink->next = newlink;
                 savelink = newlink;
             }
@@ -799,8 +818,17 @@
 
         for (p = add->chain; p; p = p->next) {
             newlink = apr_pmemdup(pool, p, sizeof(mod_filter_chain));
-            savelink->next = newlink;
-            savelink = newlink;
+            /** Filter out merged chain resets */
+            if (newlink->fname == NULL) {
+                conf->chain = savelink = newlink;
+            }
+            else if (savelink) {
+                savelink->next = newlink;
+                savelink = newlink;
+            }
+            else {
+                conf->chain = savelink = newlink;
+            }
         }
     }
     else if (add->chain) {