]> granicus.if.org Git - apache/commitdiff
Fix a config tree problem.
authorJeff Trawick <trawick@apache.org>
Fri, 4 Aug 2000 23:22:57 +0000 (23:22 +0000)
committerJeff Trawick <trawick@apache.org>
Fri, 4 Aug 2000 23:22:57 +0000 (23:22 +0000)
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 this change, ap_build_config_sub() sets *conftree before
walking *current to the end of the list.

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

server/config.c

index ddeb13ca40c19617eedefb58f1adc1057e049114..acf65482353e9d32cf447809d29989dd3e2b3365 100644 (file)
@@ -843,7 +843,8 @@ static const char *execute_now(char *cmd_line, const char *args, cmd_parms *parm
 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 @@ static const char * ap_build_config_sub(apr_pool_t *p, apr_pool_t *temp_pool,
                 }
             }
             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 @@ const char * ap_build_cont_config(apr_pool_t *p, apr_pool_t *temp_pool,
             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 @@ API_EXPORT(const char *) ap_build_config(cmd_parms *parms,
     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;