| Ticket UUID: | 3019348 | ||
| Title: | Nested lset can modify list on error | ||
| Type: | Bug | Created on: | 2010-06-22 01:32:21 |
| Submitter: | andygoth | Assigned to: | apnadkarni |
| Subsystem: | 14. List Object | Severity: | Minor |
| Priority: | 5 Medium | Last modified: | 2026-10-19 10:13:36 |
| Status: | Closed | Closed by: | apnadkarni |
| Resolution: | Fixed | Closed on: | 2026-10-19 10:13:36 |
| Version: | 8.6.18, 9.0.5, 9.1.0 | ||
| Description: | ||||
My expectation is that when lset throws an error, it won't modify the list. However, the following script shows otherwise:
% set foo {}
% lset foo 0 0 x
x
% lset foo 0 1 x
{x x}
% lset foo 1 0 x
{x x} x
% lset foo 1 1 x
{x x} {x x}
% lset foo 2 1 x
list index out of range
% set foo
{x x} {x x} {}
% lset foo 3 0 x
{x x} {x x} {} x
% lset foo 3 1 x
{x x} {x x} {} {x x}
The command [lset foo 2 1 x] throws an error but also adds an empty element to the end of the list.
| ||||
| User Comments: | ||||
serhiy.storchaka added on 2026-10-17 09:15:46:
Still present in 8.6, 9.0 and 9.1: since TIP 331 ([41ad4c4b67]) TclLsetFlat() appends an empty sublist for an index equal to the list length before checking the remaining indices, and does not remove it when one of them fails. Inside a procedure the literal list is shared and copied, which hides the problem. Proposed fix in branch lset-undo-append-on-error: remove the appended sublist on error. Tests lset-17.1 to lset-17.3. apnadkarni added on 2026-10-19 04:52:11:
@serhiy.storchaka Looks fine but I've made some modifications in branch apn-lset-undo-append-on-error to eliminate some redundant/unnecessary checks. If you are ok with those changes, you can commit that branch to trunk and 9.0. Or I can, if you prefer. serhiy.storchaka added on 2026-10-19 06:29:22:
Your changes look fine to me. The branch conflicted with trunk, where the fix for [526b01c0b9] holds a reference to the sublist around TclListObjSetElement(); I merged trunk into apn-lset-undo-append-on-error and kept that hold in your replace branch (lset-19.1 crashes without it). Please merge it to trunk and 9.0. apnadkarni added on 2026-10-19 09:58:26:
Fixed for 9.1 in [6a23978bf0]. Pending 9.0 merge. apnadkarni added on 2026-10-19 10:13:36:
Fixed for 9.0 in [27d3ea715e]. Closing. Thanks! | ||||
