diff options
author | vincentdarley <vincentdarley> | 2004-04-01 11:13:00 (GMT) |
---|---|---|
committer | vincentdarley <vincentdarley> | 2004-04-01 11:13:00 (GMT) |
commit | fcc8d73fc63d034e3e01c6b0a98935e9da182a18 (patch) | |
tree | 209477399ab57d00fcf5805625fd22d31f9434f3 | |
parent | 64a1c946139f5b56887f39a4ab6230d9acbb37bc (diff) | |
download | tcl-fcc8d73fc63d034e3e01c6b0a98935e9da182a18.zip tcl-fcc8d73fc63d034e3e01c6b0a98935e9da182a18.tar.gz tcl-fcc8d73fc63d034e3e01c6b0a98935e9da182a18.tar.bz2 |
cross-filesystem boundary glob fix
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | generic/tclIOUtil.c | 21 |
2 files changed, 26 insertions, 2 deletions
@@ -1,3 +1,10 @@ +2004-04-01 Vince Darley <vincentdarley@users.sourceforge.net> + + * generic/tclIOUtil.c: Fix to privately reported vfs bug with + 'glob -type d -dir . *' across a vfs boundary. No tests for + this are currently possible without effectively moving tclvfs + into Tcl's test suite. + 2004-03-31 Don Porter <dgp@users.sourceforge.net> * doc/msgcat.n: Clarified message catalog file encodings. [Bug 811457] diff --git a/generic/tclIOUtil.c b/generic/tclIOUtil.c index 52bec32..e82efa5 100644 --- a/generic/tclIOUtil.c +++ b/generic/tclIOUtil.c @@ -17,7 +17,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclIOUtil.c,v 1.97 2004/03/30 15:35:46 vincentdarley Exp $ + * RCS: @(#) $Id: tclIOUtil.c,v 1.98 2004/04/01 11:13:01 vincentdarley Exp $ */ #include "tclInt.h" @@ -1161,13 +1161,30 @@ FsAddMountsToGlobResult(result, pathPtr, pattern, types) } } if (!found && dir) { + int len, mlen; + CONST char *path; + CONST char *mount; if (Tcl_IsShared(result)) { Tcl_Obj *newList; newList = Tcl_DuplicateObj(result); Tcl_DecrRefCount(result); result = newList; } - Tcl_ListObjAppendElement(NULL, result, mElt); + /* + * We know mElt is absolute normalized and lies inside pathPtr, + * so now we must add to the result the right + * representation of mElt, i.e. the representation which + * is relative to pathPtr. + */ + mount = Tcl_GetStringFromObj(mElt, &mlen); + path = Tcl_GetStringFromObj(Tcl_FSGetNormalizedPath(NULL, pathPtr), + &len); + if (path[len-1] == '/') { + /* Deal with the root of the volume */ + len--; + } + mElt = TclNewFSPathObj(pathPtr, mount + len + 1, mlen - len); + Tcl_ListObjAppendElement(NULL, result, mElt); /* * No need to increment gLength, since we * don't want to compare mounts against |