httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jeff Trawick <trawi...@bellsouth.net>
Subject [PATCH] config tree problem
Date Fri, 04 Aug 2000 21:01:25 GMT
I was surprised to find a config tree problem.  

The following configuration file demonstrates the problem:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteMap    quux-map       prg:/tmp/apache-2.0/map.quux.pl
RewriteRule   ^/~quux/(.*)$  /~quux/${quux-map:$1}
</IfModule>

After this config file is parsed, the only statement in the config
tree is the last statement in the IfModule container ("RewriteRule blah
blah").

The problem is that when ap_build_config_sub() handles this type of
construct, it moves *current to the end of the list before returning.
If this construct were the first thing in the file, the caller would
set conftree to *current, not realizing that there were list elements
before *current.  The caller doesn't have addressability to those list
elements.

With the patch below, ap_build_config_sub() sets *conftree before
walking *current to the end of the list.

Comments?  Anybody have a better fix?  I'll test this a bit more in
the meantime.

Index: main/http_config.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/main/http_config.c,v
retrieving revision 1.72
diff -u -r1.72 http_config.c
--- main/http_config.c	2000/08/02 05:26:47	1.72
+++ main/http_config.c	2000/08/04 18:53:26
@@ -843,7 +843,8 @@
 static const char * ap_build_config_sub(apr_pool_t *p, apr_pool_t *temp_pool,
 					const char *l, cmd_parms *parms,
 					ap_directive_t **current,
-					ap_directive_t **curr_parent)
+					ap_directive_t **curr_parent,
+                                        ap_directive_t **conftree)
 {
     const char *args;
     char *cmd_name;
@@ -894,6 +895,12 @@
                 }
             }
             if (*current) {
+                if (!*conftree) {
+                    /* Before walking *current to the end of the list,
+                     * set the head to *current.
+                     */
+                    *conftree = *current;
+                }
                 while ((*current)->next != NULL) {
                     (*current) = (*current)->next;
                     (*current)->parent = (*curr_parent);
@@ -959,7 +966,7 @@
             break;
         } 
         retval = ap_build_config_sub(p, temp_pool, l, parms, current, 
-                                     curr_parent);
+                                     curr_parent, &conftree);
         if (retval != NULL)
             return retval;
         if (conftree == NULL && curr_parent != NULL) { 
@@ -1060,7 +1067,7 @@
     while (!(ap_cfg_getline(l, MAX_STRING_LEN, parms->config_file))) {
 
 	errmsg = ap_build_config_sub(p, temp_pool, l, parms,
-				     &current, &curr_parent);
+				     &current, &curr_parent, conftree);
 	if (errmsg != NULL)
 	    return errmsg;
 


-- 
Jeff Trawick | trawick@ibm.net | PGP public key at web site:
     http://www.geocities.com/SiliconValley/Park/9289/
          Born in Roswell... married an alien...

Mime
View raw message