diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2017-11-15 22:03:23 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2017-11-15 22:03:23 +0200 |
commit | d676b8b3b9b11efbd2c43e87a166c52a183842ce (patch) | |
tree | 7be466b76d1dc60b3a25abcbf131fe002a080066 /field.c | |
parent | 7b2e99aec44f88d10508cd56598112190397bb93 (diff) | |
parent | 303608bfc4219fbc94bda64e401f8a544db932e1 (diff) | |
download | egawk-d676b8b3b9b11efbd2c43e87a166c52a183842ce.tar.gz egawk-d676b8b3b9b11efbd2c43e87a166c52a183842ce.tar.bz2 egawk-d676b8b3b9b11efbd2c43e87a166c52a183842ce.zip |
Merge branch 'master' into feature/fix-comments
Diffstat (limited to 'field.c')
-rw-r--r-- | field.c | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -341,14 +341,20 @@ static void purge_record() { int i; - NODE *n; NF = -1; for (i = 1; i <= parse_high_water; i++) { - assert((fields_arr[i]->flags & MALLOC) == 0 - ? fields_arr[i]->valref == 1 - : true); - unref(fields_arr[i]); + NODE *n; + NODE *r = fields_arr[i]; + if ((r->flags & MALLOC) == 0 && r->valref > 1) { + /* This can and does happen. We must copy the string! */ + const char *save = r->stptr; + emalloc(r->stptr, char *, r->stlen + 1, "purge_record"); + memcpy(r->stptr, save, r->stlen); + r->stptr[r->stlen] = '\0'; + r->flags |= MALLOC; + } + unref(r); getnode(n); *n = *Null_field; fields_arr[i] = n; |