summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2006-03-29 22:19:10 (GMT)
committerdgp <dgp@users.sourceforge.net>2006-03-29 22:19:10 (GMT)
commit4fc1ccf0fbcec82d7f50f39beaeaf84b46388db7 (patch)
tree4540c3a9c4bdbaa0eb0ac055eaf9231cdcaeb552 /generic
parentee637cf09685ba523bf11f70708f24a29d50b74e (diff)
downloadtcl-4fc1ccf0fbcec82d7f50f39beaeaf84b46388db7.zip
tcl-4fc1ccf0fbcec82d7f50f39beaeaf84b46388db7.tar.gz
tcl-4fc1ccf0fbcec82d7f50f39beaeaf84b46388db7.tar.bz2
* generic/tclPathObj.c: More fixes for path normalization when /../
* tests/fileSystem.test: tries to go beyond root.[Bug 1379287]
Diffstat (limited to 'generic')
-rw-r--r--generic/tclPathObj.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/generic/tclPathObj.c b/generic/tclPathObj.c
index a40d448..f546d11 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.52 2006/03/04 02:33:36 dgp Exp $
+ * RCS: @(#) $Id: tclPathObj.c,v 1.53 2006/03/29 22:19:11 dgp Exp $
*/
#include "tclInt.h"
@@ -158,14 +158,14 @@ TclFSNormalizeAbsolutePath(
* of normalization. */
{
ClientData clientData = NULL;
- CONST char *dirSep, *oldDirSep, *pathString;
+ CONST char *dirSep, *oldDirSep, *path;
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 = -1;
int unc = 0;
Tcl_Obj *retVal = NULL;
- pathString = dirSep = TclGetString(pathPtr);
+ path = dirSep = TclGetString(pathPtr);
if (tclPlatform == TCL_PLATFORM_WINDOWS) {
if (dirSep[0] != 0 && dirSep[1] == ':' &&
@@ -196,7 +196,7 @@ TclFSNormalizeAbsolutePath(
while (*dirSep != 0) {
if ((rootOffset == -1) && IsSeparatorOrNull(dirSep[0])) {
- rootOffset = dirSep - pathString;
+ rootOffset = dirSep - path;
}
oldDirSep = dirSep;
if (!first) {
@@ -204,7 +204,7 @@ TclFSNormalizeAbsolutePath(
}
dirSep += FindSplitPos(dirSep, '/');
if (rootOffset == -1) {
- rootOffset = dirSep - pathString;
+ rootOffset = dirSep - path;
}
if (dirSep[0] == 0 || dirSep[1] == 0) {
if (retVal != NULL) {
@@ -224,8 +224,8 @@ TclFSNormalizeAbsolutePath(
*/
if (retVal == NULL) {
- CONST char *path = TclGetString(pathPtr);
- retVal = Tcl_NewStringObj(path, dirSep - path);
+ retVal = Tcl_NewStringObj(path, dirSep - path
+ + (rootOffset == dirSep - path));
Tcl_IncrRefCount(retVal);
}
dirSep += 2;
@@ -245,8 +245,8 @@ TclFSNormalizeAbsolutePath(
*/
if (retVal == NULL) {
- CONST char *path = TclGetString(pathPtr);
- retVal = Tcl_NewStringObj(path, dirSep - path);
+ retVal = Tcl_NewStringObj(path, dirSep - path
+ + (rootOffset == dirSep - path));
Tcl_IncrRefCount(retVal);
}
if (!first || (tclPlatform == TCL_PLATFORM_UNIX)) {
@@ -332,6 +332,12 @@ TclFSNormalizeAbsolutePath(
Tcl_SetObjLength(retVal, rootOffset+1);
}
}
+ } else {
+ if ((dirSep[3] != 0) || unc) {
+ Tcl_SetObjLength(retVal, rootOffset);
+ } else {
+ Tcl_SetObjLength(retVal, rootOffset+1);
+ }
}
dirSep += 3;
oldDirSep = dirSep;