This is the mail archive of the cygwin-developers@sourceware.cygnus.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Patch: traling backslash



Hi all,

I'm really surprised that nobody has seen this before.
I have found it only by chance.

If a posix path is converted to a windows path that only consists
of a drive letter, it's resolved to "<letter>:" without a
trailing backslash. This is definitely wrong! In this case the
path is not interpreted as the root dir of this drive (as it's
meant by the dll) but DOS and it's sick successors interpret it
as the current working directory on this drive. This yields to
e.g. wrong fstat results:

Imagine
	mount Z: /home

	chmod 777 /home
	ls -ld /home
	drwxrwxrwx  3 who ever 0 today   /home

	mkdir /home/foo
	cd /home/foo
	chmod 700 .
	ls -ld . ..
	drwx------  2 who ever 0 today   .
	drwx------  2 who ever 0 today   ..

The wrong output of .. is a result of the following operation:

	current working dir is Z:\foo
	.. is converted to Z: according to the mount table
	Z: is interpreted by Windows as Z:\foo

Regards,
Corinna

ChangeLog:
==========

Dec 10 20:34:00 1999  Corinna Vinschen  <corinna@vinschen.de>

	* path.cc (path_conv::path_conv): If path is converted to
	only "X:\", don't eliminate trailing backslash. If path is
	converted to only "X:", add trailing backslash.


Index: path.cc
===================================================================
RCS file: /src/cvsroot/winsup-991207/path.cc,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 path.cc
--- path.cc     1999/12/08 22:51:38     1.1.1.1
+++ path.cc     1999/12/10 19:18:12
@@ -221,6 +221,15 @@ path_conv::path_conv (const char *src, s

       /* Eat trailing slashes */
       char *tail = strchr (full_path, '\0');
+      /* If path is only a drivename, Windows interprets it as
+         the current working directory on this drive instead of
+         the root dir which is what we want. So we need
+         the trailing backslash in this case. */
+      while (tail > full_path + 3 && (*--tail == '\\'))
+        *tail = '\0';
+      if (full_path[0] && full_path[1] == ':' && full_path[2] == '\0')
+        strcat (full_path, "\\");
+
       while (tail > full_path && (*--tail == '\\'))
        *tail = '\0';

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]