dgaudet     97/08/06 12:53:56

  Modified:    src       CHANGES http_config.c http_config.h http_request.c
  Log:
  This probably fixes Brian's CGI problems.  But at any rate it's necessary
  even if it isn't the exact bug that's tickling Brian.  My first directory_walk
  optimization was corrupting the htaccess cache and the cmd->path passed
  to modules via parse_htaccess().
  
  Revision  Changes    Path
  1.386     +3 -0      apache/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apache/src/CHANGES,v
  retrieving revision 1.385
  retrieving revision 1.386
  diff -u -r1.385 -r1.386
  --- CHANGES   1997/08/05 10:49:39     1.385
  +++ CHANGES   1997/08/06 19:53:48     1.386
  @@ -1,4 +1,7 @@
   Changes with Apache 1.3a2
  +  
  +  *) Fix a bug introduced in 1.3a1 directory_walk regarding .htaccess files
  +     and corrupted paths.  [Dean Gaudet]
   
     *) Enhanced and cleaned up the URL rewriting engine of mod_rewrite:
        First the grouped parts of RewriteRule pattern matches (parenthesis!) 
can
  
  
  
  1.71      +7 -12     apache/src/http_config.c
  
  Index: http_config.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_config.c,v
  retrieving revision 1.70
  retrieving revision 1.71
  diff -u -r1.70 -r1.71
  --- http_config.c     1997/08/05 06:02:40     1.70
  +++ http_config.c     1997/08/06 19:53:50     1.71
  @@ -884,7 +884,7 @@
   
   
   int parse_htaccess(void **result, request_rec *r, int override,
  -                char *d, const char *access_name)
  +                const char *d, const char *access_name)
   {
       FILE *f = NULL;
       cmd_parms parms;
  @@ -907,17 +907,12 @@
       parms.pool = r->pool;
       parms.temp_pool = r->pool;
       parms.server = r->server;
  -    parms.path = d;
  +    parms.path = pstrdup (r->pool, d);
   
  -    if (access_name) {
  -     while (!f && access_name[0]) {
  -         char *w = getword_conf(r->pool, &access_name);
  -         filename = make_full_path(r->pool, d, w);
  -         f=pfopen(r->pool, filename, "r");
  -     }
  -    }
  -    else {
  -     filename = make_full_path(r->pool, d, 0);
  +    /* loop through the access names and find the first one */
  +    while (!f && access_name[0]) {
  +     char *w = getword_conf(r->pool, &access_name);
  +     filename = make_full_path(r->pool, d, w);
        f=pfopen(r->pool, filename, "r");
       }
       if(f) {
  @@ -941,7 +936,7 @@
   
   /* cache it */
       new = palloc(r->pool, sizeof(struct htaccess_result));
  -    new->dir = pstrdup(r->pool, d);
  +    new->dir = parms.path;
       new->override = override;
       new->htaccess = dc;
   /* add to head of list */
  
  
  
  1.42      +1 -1      apache/src/http_config.h
  
  Index: http_config.h
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_config.h,v
  retrieving revision 1.41
  retrieving revision 1.42
  diff -u -r1.41 -r1.42
  --- http_config.h     1997/07/28 18:22:43     1.41
  +++ http_config.h     1997/08/06 19:53:50     1.42
  @@ -302,7 +302,7 @@
   /* For http_core.c... (<Directory> command and virtual hosts) */
   
   int parse_htaccess(void **result, request_rec *r, int override,
  -                char *path, const char *access_name);
  +                const char *path, const char *access_name);
   const char *srm_command_loop (cmd_parms *parms, void *config);
   
   server_rec *init_virtual_host (pool *p, const char *hostname, server_rec 
*main_server);
  
  
  
  1.69      +15 -16    apache/src/http_request.c
  
  Index: http_request.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_request.c,v
  retrieving revision 1.68
  retrieving revision 1.69
  diff -u -r1.68 -r1.69
  --- http_request.c    1997/08/04 05:14:26     1.68
  +++ http_request.c    1997/08/06 19:53:51     1.69
  @@ -251,8 +251,7 @@
       core_dir_config **sec = (core_dir_config **)sec_array->elts;
       int num_sec = sec_array->nelts;
       char *test_filename = pstrdup (r->pool, r->filename);
  -    char *test_dirname, *test_htaccess;
  -
  +    char *test_dirname;
       int num_dirs, res;
       int i, test_filename_len;
   
  @@ -340,27 +339,27 @@
   
       if (S_ISDIR (r->finfo.st_mode)) ++num_dirs;
   
  -    /* we need somewhere to scratch while building directory names and
  -     * htaccess names
  +    /* We will use test_dirname as scratch space while we build directory
  +     * names during the walk.  Profiling shows directory_walk to be a busy
  +     * function so we try to avoid allocating lots of extra memory here.
        */
       test_dirname = palloc (r->pool, test_filename_len+1);
  -    test_htaccess = NULL;
       for (i = 1; i <= num_dirs; ++i) {
           core_dir_config *core_dir =
          (core_dir_config *)get_module_config(per_dir_defaults, &core_module);
        int overrides_here;
  -        void *htaccess_conf = NULL;
  -     char *test_dirname_tail;
        int j;
   
  -     test_dirname_tail = make_dirstr_prefix (test_dirname, test_filename, i);
  +     /* XXX: this could be made faster by only copying the next component
  +      * rather than copying the entire thing all over.
  +      */
  +     make_dirstr_prefix (test_dirname, test_filename, i);
   
        /* Do symlink checks first, because they are done with the
         * permissions appropriate to the *parent* directory...
         */
        
  -     if ((res = check_symlinks (test_dirname, core_dir->opts)))
  -     {
  +     if ((res = check_symlinks (test_dirname, core_dir->opts))) {
            log_reason("Symbolic link not allowed", test_dirname, r);
            return res;
        }
  @@ -416,16 +415,16 @@
         */
        
        if (overrides_here) {
  +         void *htaccess_conf = NULL;
  +
            res = parse_htaccess (&htaccess_conf, r, overrides_here,
                                  test_dirname, sconf->access_name);
            if (res) return res;
  +         if (htaccess_conf)
  +             per_dir_defaults =
  +                 merge_per_dir_configs (r->pool, per_dir_defaults,
  +                                     htaccess_conf);
        }
  -
  -     if (htaccess_conf)
  -         per_dir_defaults =
  -             merge_per_dir_configs (r->pool, per_dir_defaults,
  -                                    htaccess_conf);
  -     
       }
   
       r->per_dir_config = per_dir_defaults;
  
  
  

Reply via email to