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]);