coar        98/09/30 21:52:33

  Modified:    src/main http_core.c
               src/os/win32 util_win32.c
  Log:
        ap_os_canonical_filename was not treating 'x:/' correctly.  The
        '/' was being stripped, then we'd call GetFullPathName which
        would take 'x:' and change it to the current path on x:, not
        the root of x:.  Also, we'd end up adding another slash to
        x:/ and leave the routine with a 'x://'.
  
  PR:           3001
  Submitted by: Ken Parzygnat <[EMAIL PROTECTED]>
  Reviewed by:  Ben Laurie, Ken Coar
  
  Revision  Changes    Path
  1.232     +14 -2     apache-1.3/src/main/http_core.c
  
  Index: http_core.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/main/http_core.c,v
  retrieving revision 1.231
  retrieving revision 1.232
  diff -u -r1.231 -r1.232
  --- http_core.c       1998/09/21 21:09:48     1.231
  +++ http_core.c       1998/10/01 04:52:28     1.232
  @@ -2670,8 +2670,20 @@
                                 (r->uri + r->server->pathlen), NULL);
       }
       else {
  -        r->filename = ap_pstrcat(r->pool, conf->ap_document_root, r->uri,
  -                              NULL);
  +     /*
  +         * Make sure that we do not mess up the translation by adding two
  +         * /'s in a row.  This happens under windows when the document
  +         * root ends with a /
  +         */
  +        if ((conf->ap_document_root[strlen(conf->ap_document_root)-1] == '/')
  +         && (*(r->uri) == '/')) {
  +         r->filename = ap_pstrcat(r->pool, conf->ap_document_root, r->uri+1,
  +                                  NULL);
  +     }
  +     else {
  +         r->filename = ap_pstrcat(r->pool, conf->ap_document_root, r->uri,
  +                                  NULL);
  +     }
       }
   
       return OK;
  
  
  
  1.26      +35 -5     apache-1.3/src/os/win32/util_win32.c
  
  Index: util_win32.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/os/win32/util_win32.c,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- util_win32.c      1998/09/04 21:20:40     1.25
  +++ util_win32.c      1998/10/01 04:52:32     1.26
  @@ -23,7 +23,18 @@
       for (nSlashes = 0; s > szFile && s[-1] == '\\'; ++nSlashes, --s)
        ;
   
  -    n = GetFullPathName(szFile, sizeof buf, buf, &szFilePart);
  +    if (strlen(szFile)==2 && szFile[1]==':') {
  +        /*
  +         * If the file name is x:, do not call GetFullPathName
  +         * because it will use the current path of the executable
  +         */
  +        strcpy(buf,szFile);
  +        n = strlen(buf);
  +        szFilePart = buf + n;
  +    }
  +    else {
  +        n = GetFullPathName(szFile, sizeof buf, buf, &szFilePart);
  +    }
       ap_assert(n);
       ap_assert(n < sizeof buf);
   
  @@ -36,6 +47,8 @@
        * is no '\' in szInFile, it must just be a file name, so it should be
        * valid to use the name from GetFullPathName.  Be sure to adjust the
        * 's' variable so the rest of the code functions normally.
  +     * Note it is possible to get here when szFile == 'x:', but that is OK
  +     * because we will bail out of this routine early.
        */
       if (!s) {
           szFile = buf;
  @@ -180,9 +193,21 @@
   
       buf[0] = ap_tolower(buf[0]);
   
  -    ap_assert(strlen(buf)+nSlashes < sizeof buf);
  -    while (nSlashes--) {
  -        strcat(buf, "/");
  +    if (nSlashes) {
  +        /*
  +         * If there were additional trailing slashes, add them back on.
  +         * Be sure not to add more than were originally there though,
  +         * by checking to see if sub_canonical_filename added one;
  +         * this could happen in cases where the file name is 'd:/'
  +         */
  +        ap_assert(strlen(buf)+nSlashes < sizeof buf);
  +
  +        if (nSlashes && buf[strlen(buf)-1] == '/')
  +            nSlashes--;
  +
  +        while (nSlashes--) {
  +            strcat(buf, "/");
  +        }
       }
   
       return ap_pstrdup(pPool, buf);
  @@ -233,8 +258,13 @@
        return stat(buf, pStat);
       }
   
  +    /*
  +     * Below removes the trailing /, however, do not remove
  +     * it in the case of 'x:/' or stat will fail
  +     */
       n = strlen(szPath);
  -    if (szPath[n - 1] == '\\' || szPath[n - 1] == '/') {
  +    if ((szPath[n - 1] == '\\' || szPath[n - 1] == '/') &&
  +        !(n == 3 && szPath[1] == ':')) {
           char buf[_MAX_PATH];
           
           ap_assert(n < _MAX_PATH);
  
  
  

Reply via email to