summaryrefslogtreecommitdiffstats
path: root/generic/tclPathObj.c
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2012-01-24 22:50:46 (GMT)
committerdgp <dgp@users.sourceforge.net>2012-01-24 22:50:46 (GMT)
commita1a806f280075c02c755f1a453ca462c0db71ce1 (patch)
tree2b56638f3d8ebd9e78ae0595edd9b2b77f53ba1b /generic/tclPathObj.c
parent5af6e8ec4bfd688d0bfa411133f4b3d6a7b280c2 (diff)
downloadtcl-a1a806f280075c02c755f1a453ca462c0db71ce1.zip
tcl-a1a806f280075c02c755f1a453ca462c0db71ce1.tar.gz
tcl-a1a806f280075c02c755f1a453ca462c0db71ce1.tar.bz2
3475569 Add value-sharing checks before calls that demand unshared arguments.
Diffstat (limited to 'generic/tclPathObj.c')
-rw-r--r--generic/tclPathObj.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/generic/tclPathObj.c b/generic/tclPathObj.c
index eb19096..c32202d 100644
--- a/generic/tclPathObj.c
+++ b/generic/tclPathObj.c
@@ -269,6 +269,14 @@ TclFSNormalizeAbsolutePath(
}
if (!first || (tclPlatform == TCL_PLATFORM_UNIX)) {
link = Tcl_FSLink(retVal, NULL, 0);
+
+ /* Safety check in case driver caused sharing */
+ if (Tcl_IsShared(retVal)) {
+ TclDecrRefCount(retVal);
+ retVal = Tcl_DuplicateObj(retVal);
+ Tcl_IncrRefCount(retVal);
+ }
+
if (link != NULL) {
/*
* Got a link. Need to check if the link is relative
@@ -292,11 +300,6 @@ TclFSNormalizeAbsolutePath(
break;
}
}
- if (Tcl_IsShared(retVal)) {
- TclDecrRefCount(retVal);
- retVal = Tcl_DuplicateObj(retVal);
- Tcl_IncrRefCount(retVal);
- }
/*
* We want the trailing slash.
@@ -312,7 +315,12 @@ TclFSNormalizeAbsolutePath(
*/
TclDecrRefCount(retVal);
- retVal = link;
+ if (Tcl_IsShared(link)) {
+ retVal = Tcl_DuplicateObj(link);
+ TclDecrRefCount(link);
+ } else {
+ retVal = link;
+ }
linkStr = Tcl_GetStringFromObj(retVal, &curLen);
/*
@@ -1073,6 +1081,12 @@ Tcl_FSJoinPath(
if (sep != NULL) {
separator = TclGetString(sep)[0];
}
+ /* Safety check in case the VFS driver caused sharing */
+ if (Tcl_IsShared(res)) {
+ TclDecrRefCount(res);
+ res = Tcl_DuplicateObj(res);
+ Tcl_IncrRefCount(res);
+ }
}
if (length > 0 && ptr[length -1] != '/') {