diff options
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclPathObj.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/generic/tclPathObj.c b/generic/tclPathObj.c index be530f5..a40d448 100644 --- a/generic/tclPathObj.c +++ b/generic/tclPathObj.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclPathObj.c,v 1.51 2006/03/03 20:10:09 dgp Exp $ + * RCS: @(#) $Id: tclPathObj.c,v 1.52 2006/03/04 02:33:36 dgp Exp $ */ #include "tclInt.h" @@ -158,13 +158,14 @@ TclFSNormalizeAbsolutePath( * of normalization. */ { ClientData clientData = NULL; - CONST char *dirSep, *oldDirSep; + CONST char *dirSep, *oldDirSep, *pathString; int first = 1; /* Set to zero once we've passed the first * directory separator - we can't use '..' to * remove the volume in a path. */ - int rootOffset; + int rootOffset = -1; + int unc = 0; Tcl_Obj *retVal = NULL; - oldDirSep = dirSep = TclGetString(pathPtr); + pathString = dirSep = TclGetString(pathPtr); if (tclPlatform == TCL_PLATFORM_WINDOWS) { if (dirSep[0] != 0 && dirSep[1] == ':' && @@ -177,6 +178,7 @@ TclFSNormalizeAbsolutePath( * since the first two segments are actually inseparable. */ + unc = 1; dirSep += 2; dirSep += FindSplitPos(dirSep, '/'); if (*dirSep != 0) { @@ -192,13 +194,18 @@ TclFSNormalizeAbsolutePath( * since we will have to expand the link to be able to back up one level. */ - rootOffset = dirSep - oldDirSep; while (*dirSep != 0) { + if ((rootOffset == -1) && IsSeparatorOrNull(dirSep[0])) { + rootOffset = dirSep - pathString; + } oldDirSep = dirSep; if (!first) { dirSep++; } dirSep += FindSplitPos(dirSep, '/'); + if (rootOffset == -1) { + rootOffset = dirSep - pathString; + } if (dirSep[0] == 0 || dirSep[1] == 0) { if (retVal != NULL) { Tcl_AppendToObj(retVal, oldDirSep, dirSep - oldDirSep); @@ -319,7 +326,7 @@ TclFSNormalizeAbsolutePath( } if (curLen == 0) { /* Attempt to .. beyond root becomes root: "/" */ - if (dirSep[3] != 0) { + if ((dirSep[3] != 0) || unc) { Tcl_SetObjLength(retVal, rootOffset); } else { Tcl_SetObjLength(retVal, rootOffset+1); |