diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2017-11-15 22:01:58 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2017-11-15 22:01:58 +0200 |
commit | 303608bfc4219fbc94bda64e401f8a544db932e1 (patch) | |
tree | 905bb1faeb9d2ffb898aab883a1a5414937bb60e /field.c | |
parent | 0b70cb57ca6b843d4a28f9a918f8adb3f8fa0b3c (diff) | |
parent | b4b1162e427f634567e09bda421f947c3c8db9ce (diff) | |
download | egawk-303608bfc4219fbc94bda64e401f8a544db932e1.tar.gz egawk-303608bfc4219fbc94bda64e401f8a544db932e1.tar.bz2 egawk-303608bfc4219fbc94bda64e401f8a544db932e1.zip |
Merge branch 'gawk-4.2-stable'
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; |