fielding    97/04/07 04:47:07

  Modified:    src       CHANGES http_request.c
  Log:
  The addition of <Location> and <File> directives made the
  sub_req_lookup_simple() function bogus, so we now handle
  the special cases directly.  The patch affects mainly
  multiviews into a file that matches a <Files> section.
  
  Submitted by: Dean Gaudet
  Reviewed by: Roy Fielding
  
  Revision  Changes    Path
  1.225     +4 -0      apache/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apache/src/CHANGES,v
  retrieving revision 1.224
  retrieving revision 1.225
  diff -C3 -r1.224 -r1.225
  *** CHANGES   1997/04/07 10:19:30     1.224
  --- CHANGES   1997/04/07 11:47:05     1.225
  ***************
  *** 1,5 ****
  --- 1,9 ----
    Changes with Apache 1.2b8
    
  +   *) The addition of <Location> and <File> directives made the
  +      sub_req_lookup_simple() function bogus, so we now handle
  +      the special cases directly.  [Dean Gaudet]
  + 
      *) We now try to log where the server is dumping core when a fatal
         signal is received.  [Ken Coar]
    
  
  
  
  1.47      +52 -55    apache/src/http_request.c
  
  Index: http_request.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_request.c,v
  retrieving revision 1.46
  retrieving revision 1.47
  diff -C3 -r1.46 -r1.47
  *** http_request.c    1997/02/21 00:22:29     1.46
  --- http_request.c    1997/04/07 11:47:05     1.47
  ***************
  *** 563,605 ****
        return rr;
    }
    
  - request_rec *sub_req_lookup_simple (const char *new_file, const request_rec 
*r)
  - {
  -     /* This handles the simple case, common to ..._lookup_uri and _file,
  -      * of looking up another file in the same directory.
  -      */
  -     request_rec *rnew = make_sub_request (r);
  -     pool *rnewp = rnew->pool;
  -     int res;
  -     
  -     char *udir = make_dirstr(rnewp, r->uri, count_dirs(r->uri));
  -     char *fdir = make_dirstr(rnewp, r->filename, count_dirs(r->filename));
  - 
  -     *rnew = *r;                     /* Copy per_dir config, etc. */
  -     rnew->pool = rnewp;
  -     rnew->uri = make_full_path (rnewp, udir, new_file);
  -     rnew->filename = make_full_path (rnewp, fdir, new_file);
  -     set_sub_req_protocol (rnew, r);
  -     
  -     rnew->finfo.st_mode = 0;
  -     
  -     if ((res = check_symlinks (rnew->filename, allow_options (rnew))))
  -     {
  -         rnew->status = res;
  -     }
  - 
  -     if (rnew->finfo.st_mode == 0 && stat (rnew->filename, &rnew->finfo) < 0)
  -         rnew->finfo.st_mode = 0;
  - 
  -     if ((rnew->status == HTTP_OK) && (res = find_types (rnew)))
  -         rnew->status = res;
  -     
  -     if ((rnew->status == HTTP_OK) && (res = run_fixups (rnew)))
  -         rnew->status = res;
  -     
  -     return rnew;
  - }
  - 
    
    request_rec *sub_req_lookup_uri (const char *new_file, const request_rec *r)
    {
  --- 563,568 ----
  ***************
  *** 681,712 ****
        request_rec *rnew;
        int res;
        char *fdir;
  -     
  -     /* Check for a special case... if there are no '/' characters in 
new_file
  -      * at all, then we are looking at a relative lookup in the same 
directory.
  -      * That means we don't have to redo any access checks.
  -      */
  - 
  -     if (strchr (new_file, '/') == NULL) 
  -         return sub_req_lookup_simple (new_file, r);
    
        rnew = make_sub_request (r);
  -     fdir = make_dirstr (rnew->pool, r->filename, count_dirs (r->filename));
        rnew->request_time = r->request_time;
        rnew->connection = r->connection; /* For now... */
        rnew->server = r->server;
        rnew->request_config = create_request_config (rnew->pool);
        rnew->htaccess = r->htaccess; /* copy htaccess cache */
  -     rnew->per_dir_config = r->server->lookup_defaults;
        set_sub_req_protocol (rnew, r);
  !     
  !     rnew->uri = "INTERNALLY GENERATED file-relative req";
  !     rnew->filename = ((new_file[0] == '/') ?
  !                   pstrdup(rnew->pool,new_file) :
  !                   make_full_path (rnew->pool, fdir, new_file));
  !     
  !     if ((res = directory_walk (rnew))
  !     || (res = file_walk (rnew))
            || ((satisfies(rnew)==SATISFY_ALL || 
satisfies(rnew)==SATISFY_NOSPEC)?
            ((res = check_access (rnew))
             || (some_auth_required (rnew) &&
  --- 644,709 ----
        request_rec *rnew;
        int res;
        char *fdir;
    
        rnew = make_sub_request (r);
        rnew->request_time = r->request_time;
        rnew->connection = r->connection; /* For now... */
        rnew->server = r->server;
        rnew->request_config = create_request_config (rnew->pool);
        rnew->htaccess = r->htaccess; /* copy htaccess cache */
        set_sub_req_protocol (rnew, r);
  !     fdir = make_dirstr (rnew->pool, r->filename, count_dirs (r->filename));
  ! 
  !     /* Check for a special case... if there are no '/' characters in 
new_file
  !      * at all, then we are looking at a relative lookup in the same 
directory.
  !      * That means we won't have to redo directory_walk, and we may not
  !      * even have to redo access checks.
  !      */
  ! 
  !     if (strchr (new_file, '/') == NULL) {
  !     char *udir = make_dirstr(rnew->pool, r->uri, count_dirs(r->uri));
  ! 
  !     rnew->uri = make_full_path (rnew->pool, udir, new_file);
  !     rnew->filename = make_full_path (rnew->pool, fdir, new_file);
  !     if (stat (rnew->filename, &rnew->finfo) < 0) {
  !         rnew->finfo.st_mode = 0;
  !     }
  ! 
  !     rnew->per_dir_config = r->per_dir_config;
  ! 
  !     if ((res = check_symlinks (rnew->filename, allow_options (rnew)))) {
  !         log_reason ("Symbolic link not allowed", rnew->filename, rnew);
  !         rnew->status = res;
  !         return rnew;
  !     }
  !     /* do a file_walk, if it doesn't change the per_dir_config then
  !      * we know that we don't have to redo all the access checks */
  !     if ((res = file_walk (rnew))) {
  !         rnew->status = res;
  !         return rnew;
  !     }
  !     if (rnew->per_dir_config == r->per_dir_config) {
  !         if ((res = find_types (rnew)) || (res = run_fixups (rnew))) {
  !             rnew->status = res;
  !         }
  !         return rnew;
  !     }
  !     } else {
  !     /* XXX: this should be set properly like it is in the same-dir case
  !      * but it's actually sometimes to impossible to do it... because the
  !      * file may not have a uri associated with it -djg */
  !     rnew->uri = "INTERNALLY GENERATED file-relative req";
  !     rnew->filename = ((new_file[0] == '/') ?
  !                     pstrdup(rnew->pool,new_file) :
  !                     make_full_path (rnew->pool, fdir, new_file));
  !     rnew->per_dir_config = r->server->lookup_defaults;
  !     res = directory_walk (rnew);
  !     if (!res) {
  !         res = file_walk (rnew);
  !     }
  !     }
  ! 
  !     if (res
            || ((satisfies(rnew)==SATISFY_ALL || 
satisfies(rnew)==SATISFY_NOSPEC)?
            ((res = check_access (rnew))
             || (some_auth_required (rnew) &&
  
  
  

Reply via email to