aboutsummaryrefslogtreecommitdiffstats
path: root/field.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2017-11-15 22:01:58 +0200
committerArnold D. Robbins <arnold@skeeve.com>2017-11-15 22:01:58 +0200
commit303608bfc4219fbc94bda64e401f8a544db932e1 (patch)
tree905bb1faeb9d2ffb898aab883a1a5414937bb60e /field.c
parent0b70cb57ca6b843d4a28f9a918f8adb3f8fa0b3c (diff)
parentb4b1162e427f634567e09bda421f947c3c8db9ce (diff)
downloadegawk-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.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;