aboutsummaryrefslogtreecommitdiffstats
path: root/field.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2017-11-15 22:03:23 +0200
committerArnold D. Robbins <arnold@skeeve.com>2017-11-15 22:03:23 +0200
commitd676b8b3b9b11efbd2c43e87a166c52a183842ce (patch)
tree7be466b76d1dc60b3a25abcbf131fe002a080066 /field.c
parent7b2e99aec44f88d10508cd56598112190397bb93 (diff)
parent303608bfc4219fbc94bda64e401f8a544db932e1 (diff)
downloadegawk-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.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/field.c b/field.c
index 5ab718d4..5263cc61 100644
--- a/field.c
+++ b/field.c
@@ -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;