aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2017-04-12 23:32:03 +0300
committerArnold D. Robbins <arnold@skeeve.com>2017-04-12 23:32:03 +0300
commitbbd26f5f61b1dae2d1638a45088105be616cf2fd (patch)
tree3ea5059ec653f606999ca0a72dbbc590ad435927
parent8850b2870ae9665b302dd4d3035449a2a371ff27 (diff)
parent9fff07da8c25183f53934c0155d1fa49bc97198e (diff)
downloadegawk-bbd26f5f61b1dae2d1638a45088105be616cf2fd.tar.gz
egawk-bbd26f5f61b1dae2d1638a45088105be616cf2fd.tar.bz2
egawk-bbd26f5f61b1dae2d1638a45088105be616cf2fd.zip
Merge branch 'master' into feature/api-mpfr
-rw-r--r--ChangeLog6
-rw-r--r--field.c13
-rw-r--r--mpfr.c1
3 files changed, 17 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 04091617..e1072ef7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2017-04-12 Arnold D. Robbins <arnold@skeeve.com>
+ * mpfr.c (mpg_format_val): Set STRCUR flag when we're done.
+ Fixes a memory leak. Thanks to valgrind for the report.
+
* gawkapi.c (awk_value_to_node): Initialize ext_ret_val to NULL
to avoid compiler warnings.
@@ -11,6 +14,9 @@
* field.c (fpat_parse_field): Restructure the code to reduce complexity
and document the new structure.
+ * field.c (fpat_parse_field): Further restructuring to avoid
+ invalid reads as reported by valgrind.
+
2017-04-10 Andrew J. Schorr <aschorr@telemetry-investments.com>
* awk.h (enum opcodeval): For the avoidance of doubt, specify that
diff --git a/field.c b/field.c
index 8145141c..608be7da 100644
--- a/field.c
+++ b/field.c
@@ -1581,7 +1581,7 @@ fpat_parse_field(long up_to, /* parse only up to this field number */
int regex_flags = RE_NEED_START;
mbstate_t mbs;
char* field_start;
- bool field_found;
+ bool field_found = false;
memset(&mbs, 0, sizeof(mbstate_t));
@@ -1594,7 +1594,7 @@ fpat_parse_field(long up_to, /* parse only up to this field number */
if (rp == NULL) /* use FPAT */
rp = FPAT_regexp;
- while (scan <= end && nf < up_to) { /* still something to parse */
+ while (scan < end && nf < up_to) { /* still something to parse */
/* first attempt to match the next field */
start = scan;
@@ -1632,10 +1632,17 @@ fpat_parse_field(long up_to, /* parse only up to this field number */
*/
if (sep_arr != NULL)
set_element(nf, start, (long) (end - start), sep_arr);
- scan = end + 1;
+ scan = end;
}
}
+ /*
+ * If the last field extends up to the end of the record, generate
+ * a null trailing separator
+ */
+ if (sep_arr != NULL && scan == end && field_found)
+ set_element(nf, scan, 0L, sep_arr);
+
*buf = scan;
return nf;
}
diff --git a/mpfr.c b/mpfr.c
index 5071d0c9..447e23c6 100644
--- a/mpfr.c
+++ b/mpfr.c
@@ -372,6 +372,7 @@ mpg_format_val(const char *format, int index, NODE *s)
if ((s->flags & (MALLOC|STRCUR)) == (MALLOC|STRCUR))
efree(s->stptr);
s->stptr = r->stptr;
+ s->flags |= STRCUR;
freenode(r); /* Do not unref(r)! We want to keep s->stptr == r->stpr. */
free_wstr(s);
return s;