diff options
author | dgp <dgp@users.sourceforge.net> | 2012-01-24 22:50:46 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2012-01-24 22:50:46 (GMT) |
commit | 52314e88010b41c7ec12e6fea5400cbb55404b02 (patch) | |
tree | 2b56638f3d8ebd9e78ae0595edd9b2b77f53ba1b /generic | |
parent | aeb5c0bbbc58961750c494fd869dfa44bc2a4369 (diff) | |
download | tcl-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.c | 26 |
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] != '/') { |