summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2012-01-26 16:33:17 (GMT)
committerdgp <dgp@users.sourceforge.net>2012-01-26 16:33:17 (GMT)
commit8312da70be77c03f1d366457afbda923902b1877 (patch)
tree5a5647f374f8f81581dbc9253cf690759a5b0ef4
parentb58fad5a4b05a86acfb62843f78a7732a1bf4758 (diff)
parent5462a3c12e21dd3161d2a1e1a2e8e53fb86ecb88 (diff)
downloadtcl-8312da70be77c03f1d366457afbda923902b1877.zip
tcl-8312da70be77c03f1d366457afbda923902b1877.tar.gz
tcl-8312da70be77c03f1d366457afbda923902b1877.tar.bz2
3475569 Add value-sharing checks before calls that demand unshared arguments.
-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] != '/') {