You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by co...@hyperreal.org on 1998/09/04 22:17:48 UTC

cvs commit: apache-1.3/src/os/win32 util_win32.c

coar        98/09/04 13:17:47

  Modified:    src/os/win32 util_win32.c
  Log:
  	Fix Win32 problems with <Files .htaccess>, <Directory />,
  	and <Directory .>.
  
  PR:		2915, 2953
  Submitted by:	Ken Parzygnat <KP...@US.IBM.Com>
  Reviewed by:	Ken Coar
  
  Revision  Changes    Path
  1.23      +47 -17    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.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- util_win32.c	1998/07/13 07:06:16	1.22
  +++ util_win32.c	1998/09/04 20:17:47	1.23
  @@ -6,7 +6,7 @@
   #include "http_log.h"
   
   /* Returns TRUE if the path is real, FALSE if it is PATH_INFO */
  -static BOOL sub_canonical_filename(char *szCanon, unsigned nCanon, const char *szFile)
  +static BOOL sub_canonical_filename(char *szCanon, unsigned nCanon, const char *szInFile)
   {
       char buf[HUGE_STRING_LEN];
       int n;
  @@ -15,7 +15,9 @@
       int nSlashes;
       WIN32_FIND_DATA d;
       HANDLE h;
  +    const char *szFile;
   
  +    szFile = szInFile;
       s=strrchr(szFile,'\\');
       for(nSlashes=0 ; s > szFile && s[-1] == '\\' ; ++nSlashes,--s)
   	;
  @@ -24,6 +26,20 @@
       ap_assert(n);
       ap_assert(n < sizeof buf);
   
  +    /*
  +     * There is an implicit assumption that szInFile will contain a '\'.  If this 
  +     * is not true (as in the case of <Directory *> or <File .htaccess>) we would 
  +     * assert in some of the code below.  Therefore, if we don't get any '\' in   
  +     * the file name, then use the file name we get from GetFullPathName, because 
  +     * it will have at least one '\'.  If there 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.
  +     */
  +    if (!s) {
  +        szFile = buf;
  +        s=strrchr(szFile,'\\');
  +    }
  +
       /* If we have \\machine\share, convert to \\machine\share\ */
       if (buf[0] == '\\' && buf[1] == '\\') {
   	char *s=strchr(buf+2,'\\');
  @@ -106,7 +122,7 @@
       char b2[HUGE_STRING_LEN];
       const char *s;
       char *d;
  -    int nSlashes;
  +    int nSlashes=0;
   
       ap_assert(strlen(szFile) < sizeof b2);
   
  @@ -116,22 +132,36 @@
          Simultaneously, rewrite / to \.
          This is a bit of a kludge - Ben.
       */
  -    for(s=szFile,d=b2 ; (*d=*s) ; ++d,++s) {
  -	if(*s == '/')
  -	    *d='\\';
  -	if(*s == '.' && (s[1] == '/' || s[1] == '\\' || !s[1])) {
  -	    while(*d == '.')
  -		--d;
  -	    if(*d == '\\')
  -		--d;
  -	    }
  -	}
  -    // Finally, a trailing slash(es) screws thing, so blow them away
  -    for(nSlashes=0 ; d > b2 && d[-1] == '\\' ; --d,++nSlashes)
  -	;
  -    /* XXXX this breaks '/' and 'c:/' cases */
  -    *d='\0';
  +    if (strlen(szFile) == 1) {
  +        /*
  +         *  If the file is only one char (like in the case of / or .) then just pass
  +         *  that through to sub_canonical_filename.  Convert a '/' to '\\' if necessary.
  +         */
  +        if (szFile[0] == '/')
  +            b2[0] = '\\';
  +        else
  +            b2[0] = szFile[0];
   
  +        b2[1] = '\0';
  +    }
  +    else {
  +        for(s=szFile,d=b2 ; (*d=*s) ; ++d,++s) {
  +	          if(*s == '/')
  +	              *d='\\';
  +	          if(*s == '.' && (s[1] == '/' || s[1] == '\\' || !s[1])) {
  +	              while(*d == '.')
  +		                --d;
  +	              if(*d == '\\')
  +		                --d;
  +	          }
  +	      }
  +
  +        // Finally, a trailing slash(es) screws thing, so blow them away
  +        for(nSlashes=0 ; d > b2 && d[-1] == '\\' ; --d,++nSlashes)
  +	    ;
  +        /* XXXX this breaks '/' and 'c:/' cases */
  +        *d='\0';
  +    }
       sub_canonical_filename(buf, sizeof buf, b2);
   
       buf[0]=ap_tolower(buf[0]);