diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2016-06-23 08:21:42 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2016-06-23 08:21:42 (GMT) |
commit | e577cd8cf8ba504129e0b4ca6e698e442e55eacb (patch) | |
tree | a1782bd818ef484be2537ef6d84f6a6f11048537 /generic/tclExecute.c | |
parent | ff29c56ea43cdd5088f90248e320b1cfc28b2cc1 (diff) | |
parent | f05e2297802cbc2f12f67acb22ca3680f36d38c8 (diff) | |
download | tcl-e577cd8cf8ba504129e0b4ca6e698e442e55eacb.zip tcl-e577cd8cf8ba504129e0b4ca6e698e442e55eacb.tar.gz tcl-e577cd8cf8ba504129e0b4ca6e698e442e55eacb.tar.bz2 |
[d553228d9f] Stop crashes in [dict update] with low refcount dictionaries.
Diffstat (limited to 'generic/tclExecute.c')
-rw-r--r-- | generic/tclExecute.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c index cd28a92..3f57333 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -7706,6 +7706,7 @@ TEBCresume( goto gotError; } } + Tcl_IncrRefCount(dictPtr); if (TclListObjGetElements(interp, OBJ_AT_TOS, &length, &keyPtrPtr) != TCL_OK) { TRACE_ERROR(interp); @@ -7718,6 +7719,7 @@ TEBCresume( if (Tcl_DictObjGet(interp, dictPtr, keyPtrPtr[i], &valuePtr) != TCL_OK) { TRACE_ERROR(interp); + Tcl_DecrRefCount(dictPtr); goto gotError; } varPtr = LOCAL(duiPtr->varIndices[i]); @@ -7734,10 +7736,12 @@ TEBCresume( duiPtr->varIndices[i]) == NULL) { CACHE_STACK_INFO(); TRACE_ERROR(interp); + Tcl_DecrRefCount(dictPtr); goto gotError; } CACHE_STACK_INFO(); } + TclDecrRefCount(dictPtr); TRACE_APPEND(("OK\n")); NEXT_INST_F(9, 0, 0); |