summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraspect <aspect+tclcore@abstracted-spleen.org>2017-04-29 11:04:10 (GMT)
committeraspect <aspect+tclcore@abstracted-spleen.org>2017-04-29 11:04:10 (GMT)
commit83852c4bca6320aa6c14b148b137430aec4c5260 (patch)
treeba4b36e067db9d738e5ad918327137c0de090c20
parent52482ea1e528751dcb61e736532dcc86469ccbc3 (diff)
downloadtcl-bug_f9fe90d0fa.zip
tcl-bug_f9fe90d0fa.tar.gz
tcl-bug_f9fe90d0fa.tar.bz2
[f9fe90d0fa]: more path normalization in TclNewFSPathObjbug_f9fe90d0fa
-rw-r--r--generic/tclPathObj.c9
-rw-r--r--tests/fileSystem.test10
2 files changed, 19 insertions, 0 deletions
diff --git a/generic/tclPathObj.c b/generic/tclPathObj.c
index 43a3c85..ea15937 100644
--- a/generic/tclPathObj.c
+++ b/generic/tclPathObj.c
@@ -1278,6 +1278,15 @@ TclNewFSPathObj(
const char *p;
int state = 0, count = 0;
+ /* if dirPtr is already tclFsPathType, its string representation
+ * may not be canonical. Try to use its normPathPtr in this case.
+ */
+ if ( (dirPtr->typePtr == &tclFsPathType)
+ && (PATHOBJ(dirPtr)->cwdPtr == NULL)
+ && (PATHOBJ(dirPtr)->normPathPtr != NULL) ) {
+ dirPtr = PATHOBJ(dirPtr)->normPathPtr;
+ }
+
/* [Bug 2806250] - this is only a partial solution of the problem.
* The PATHFLAGS != 0 representation assumes in many places that
* the "tail" part stored in the normPathPtr field is itself a
diff --git a/tests/fileSystem.test b/tests/fileSystem.test
index 1941936..4513fcb 100644
--- a/tests/fileSystem.test
+++ b/tests/fileSystem.test
@@ -367,6 +367,16 @@ test filesystem-1.51 {file normalisation .. beyond root (Bug 1379287)} {
test filesystem-1.51.1 {file normalisation .. beyond root (Bug 1379287)} {
testPathEqual [file norm /../../] [file norm /]
} ok
+test filesystem-1.52 {bug f9f390d0fa: file join where strep is not canonical} -body {
+ set x //foo
+ file normalize $x
+ file join $x bar
+} -result /foo/bar
+test filesystem-1.52.1 {bug f9f390d0fa: file join where strep is not canonical} -body {
+ set x //foo
+ file normalize $x
+ file join $x
+} -result /foo
test filesystem-2.0 {new native path} {unix} {
foreach f [lsort [glob -nocomplain /usr/bin/c*]] {