summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
Diffstat (limited to 'generic')
-rw-r--r--generic/tclIOCmd.c2
-rwxr-xr-xgeneric/tclStrToD.c2
-rw-r--r--generic/tclTrace.c10
3 files changed, 12 insertions, 2 deletions
diff --git a/generic/tclIOCmd.c b/generic/tclIOCmd.c
index e166e94..0c05cbf 100644
--- a/generic/tclIOCmd.c
+++ b/generic/tclIOCmd.c
@@ -138,7 +138,7 @@ Tcl_PutsObjCmd(
chanObjPtr = objv[2];
string = objv[3];
break;
- } else if (strcmp(TclGetString(objv[2]), "nonewline") == 0) {
+ } else if (strcmp(TclGetString(objv[3]), "nonewline") == 0) {
/*
* The code below provides backwards compatibility with an old
* form of the command that is no longer recommended or
diff --git a/generic/tclStrToD.c b/generic/tclStrToD.c
index e8b7538..421657c 100755
--- a/generic/tclStrToD.c
+++ b/generic/tclStrToD.c
@@ -3790,7 +3790,7 @@ ShorteningBignumConversion(Double* dPtr,
if (m2plus > m2minus) {
mp_clear(&mplus);
}
- mp_clear_multi(&b, &mminus, &temp, NULL);
+ mp_clear_multi(&b, &mminus, &temp, &dig, &S, NULL);
*s = '\0';
*decpt = k;
if (endPtr) {
diff --git a/generic/tclTrace.c b/generic/tclTrace.c
index 49c57bc..28e6934 100644
--- a/generic/tclTrace.c
+++ b/generic/tclTrace.c
@@ -2874,6 +2874,16 @@ Tcl_UntraceVar2(
* The code below makes it possible to delete traces while traces are
* active: it makes sure that the deleted trace won't be processed by
* TclCallVarTraces.
+ *
+ * Caveat (Bug 3062331): When an unset trace handler on a variable
+ * tries to delete a different unset trace handler on the same variable,
+ * the results may be surprising. When variable unset traces fire, the
+ * traced variable is already gone. So the TclLookupVar() call above
+ * will not find that variable, and not finding it will never reach here
+ * to perform the deletion. This means callers of Tcl_UntraceVar*()
+ * attempting to delete unset traces from within the handler of another
+ * unset trace have to account for the possibility that their call to
+ * Tcl_UntraceVar*() is a no-op.
*/
for (activePtr = iPtr->activeVarTracePtr; activePtr != NULL;