summaryrefslogtreecommitdiffstats
path: root/generic
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)
commit52314e88010b41c7ec12e6fea5400cbb55404b02 (patch)
tree2b56638f3d8ebd9e78ae0595edd9b2b77f53ba1b /generic
parentaeb5c0bbbc58961750c494fd869dfa44bc2a4369 (diff)
downloadtcl-52314e88010b41c7ec12e6fea5400cbb55404b02.zip
tcl-52314e88010b41c7ec12e6fea5400cbb55404b02.tar.gz
tcl-52314e88010b41c7ec12e6fea5400cbb55404b02.tar.bz2
3475569 Add value-sharing checks before calls that demand unshared arguments.
Diffstat (limited to 'generic')
-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] != '/') {