unix fix
authorVince Darley <vincentdarley@sourceforge.net>
Sun, 2 Dec 2001 23:07:31 +0000 (23:07 +0000)
committerVince Darley <vincentdarley@sourceforge.net>
Sun, 2 Dec 2001 23:07:31 +0000 (23:07 +0000)
ChangeLog
generic/vfs.c
win/makefile.vc

index 00e60c78a25849d65c159f46dd146b9b9e0b83a0..4c2c8259ce65e0e4a6805677bfc45475f21e06a7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2001-12-02 Vince Darley <vincentdarley@sourceforge.net>
+       * generic/vfs.c: minor code cleanup and simplification. Fix
+       to problem with absolute paths on unix systems introduced in
+       recent changes.
+       
 2001-11-21 Vince Darley <vincentdarley@sourceforge.net>
        * generic/vfs.c: added more comments to the code, and 
        made mount point checking faster and simpler (we no longer
index 066e547a4f8acb0707956d44748d27bfbd966454..ecc69d813c3e0ac70d10243879b64e13ad1b6e31 100644 (file)
@@ -807,8 +807,6 @@ VfsPathInFilesystem(Tcl_Obj *pathPtr, ClientData *clientDataPtr) {
     normed = Tcl_GetStringFromObj(normedObj, &len);
     splitPosition = len;
 
-    if (len == 0) return -1;
-    
     /* 
      * Find the most specific mount point for this path.
      * Mount points are specified by unique strings, so
@@ -820,6 +818,18 @@ VfsPathInFilesystem(Tcl_Obj *pathPtr, ClientData *clientDataPtr) {
      * checking for valid mount points at each separator.
      */
     while (1) {
+       /* 
+        * We need this test here both for an empty string being
+        * passed in above, and so that if we are testing a unix
+        * absolute path /foo/bar we will come around the loop
+        * with splitPosition at 0 for the last test, and we
+        * must return then.
+        */
+       if (splitPosition == 0) {
+           return -1;
+       }
+       
+       /* Is the path up to 'splitPosition' a valid moint point? */
        interpCmd = Vfs_FindMount(normedObj, splitPosition);
        if (interpCmd != NULL) break;
 
@@ -836,15 +846,18 @@ VfsPathInFilesystem(Tcl_Obj *pathPtr, ClientData *clientDataPtr) {
        /* 
         * We now know that normed[splitPosition] is a separator.
         * However, we might have mounted a root filesystem with a
-        * strange name (for example 'ftp://')
+        * name (for example 'ftp://') which actually includes a
+        * separator.  Therefore we test whether the path with
+        * a separator is a mount point.
+        * 
+        * Since we must have decremented splitPosition at least once
+        * already (above) 'splitPosition+1 <= len' so this won't
+        * access invalid memory.
         */
-       if (splitPosition != len) {
-           interpCmd = Vfs_FindMount(normedObj, splitPosition+1);
-                                    
-           if (interpCmd != NULL) {
-               splitPosition++;
-               break;
-           }
+       interpCmd = Vfs_FindMount(normedObj, splitPosition+1);
+       if (interpCmd != NULL) {
+           splitPosition++;
+           break;
        }
     }
     
index 49c2e58125be911b73f6c7188b56456d3927fb53..315911d3b9e2c6afc1e6b410f0724c0c903b58cd 100644 (file)
@@ -13,7 +13,7 @@ VFS_VERSION = 1.0
 DLL_VERSION = 10
 
 # comment the following line to compile with symbols
-NODEBUG=1
+NODEBUG=0
 
 !IF "$(NODEBUG)" == "1"
 DEBUGDEFINES =