diff options
author | Steve Bennett <steveb@workware.net.au> | 2017-05-11 21:21:10 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2017-05-12 13:01:34 +1000 |
commit | 1d6b931d0c873bbad193677734dc9d352628577b (patch) | |
tree | 8a24462fd66b26316e7d1caf8d9b01433c5db15e | |
parent | 31a9f433f06b8cc426d281436a628a5fdd3bf755 (diff) | |
download | jimtcl-1d6b931d0c873bbad193677734dc9d352628577b.zip jimtcl-1d6b931d0c873bbad193677734dc9d352628577b.tar.gz jimtcl-1d6b931d0c873bbad193677734dc9d352628577b.tar.bz2 |
lsort: Fix a refcount issue
Only duplicate a shared object
Reported-by: Ryan Whitworth <me@ryanwhitworth.com>
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim.c | 7 | ||||
-rw-r--r-- | regtest.tcl | 6 |
2 files changed, 11 insertions, 2 deletions
@@ -12759,6 +12759,7 @@ static int Jim_LsortCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const arg Jim_Obj *resObj; int i; int retCode; + int shared; struct lsort_info info; @@ -12824,12 +12825,14 @@ static int Jim_LsortCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const arg break; } } - resObj = Jim_DuplicateObj(interp, argv[argc - 1]); + resObj = argv[argc - 1]; + if ((shared = Jim_IsShared(resObj))) + resObj = Jim_DuplicateObj(interp, resObj); retCode = ListSortElements(interp, resObj, &info); if (retCode == JIM_OK) { Jim_SetResult(interp, resObj); } - else { + else if (shared) { Jim_FreeNewObj(interp, resObj); } return retCode; diff --git a/regtest.tcl b/regtest.tcl index 5eada12..c18e662 100644 --- a/regtest.tcl +++ b/regtest.tcl @@ -288,6 +288,12 @@ puts "TEST 38 PASSED" catch {set a $(5?6,7?8:?9:10%11:12)} puts "TEST 39 PASSED" +# REGTEST 40 +# ref count problem - double free +set d [dict create a b] +lsort r($d) +puts "TEST 40 PASSED" + # TAKE THE FOLLOWING puts AS LAST LINE puts "--- ALL TESTS PASSED ---" |