diff options
author | Andrew J. Schorr <aschorr@telemetry-investments.com> | 2017-11-25 13:33:00 -0500 |
---|---|---|
committer | Andrew J. Schorr <aschorr@telemetry-investments.com> | 2017-11-25 13:33:00 -0500 |
commit | 6f3e075b3ad1e6cd5b3268fce65c768340b00a5b (patch) | |
tree | d9da26f73ba60392074c49dd907c9ceff17676e1 | |
parent | 03caf83ac9d2862ca72daa5d18f2af27d68db1d4 (diff) | |
download | egawk-6f3e075b3ad1e6cd5b3268fce65c768340b00a5b.tar.gz egawk-6f3e075b3ad1e6cd5b3268fce65c768340b00a5b.tar.bz2 egawk-6f3e075b3ad1e6cd5b3268fce65c768340b00a5b.zip |
Fix potential field corruption when $0 is set from the debugger.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | debug.c | 5 |
2 files changed, 9 insertions, 2 deletions
@@ -1,3 +1,9 @@ +2017-11-25 Andrew J. Schorr <aschorr@telemetry-investments.com> + + * debug.c (do_set_var): As in interpret.h (Op_store_field), we should + call the assign function before unref to give it a chance to copy + any non-malloced $n string values before freeing $0. + 2017-11-14 Andrew J. Schorr <aschorr@telemetry-investments.com> * mpfr.c (get_rnd_mode): Fix MPFR_RNDA comment. @@ -1299,10 +1299,11 @@ do_set_var(CMDARG *arg, int cmd ATTRIBUTE_UNUSED) arg = arg->next; val = arg->a_node; lhs = get_field(field_num, &assign); - unref(*lhs); - *lhs = dupnode(val); if (assign) + /* call assign to copy fields before unref frees $0 */ assign(); + unref(*lhs); + *lhs = dupnode(val); print_field(field_num); } break; |