aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2014-05-09 12:00:20 +0300
committerArnold D. Robbins <arnold@skeeve.com>2014-05-09 12:00:20 +0300
commit57dfae2cdd29002643719cfb42b42aeb50e57bfe (patch)
tree2a9c29685a04d840117594852a901cb13e61de48
parent7dfa21486fdb9f30f8adcb7b7207458000b02866 (diff)
parent40694fc1c11bae6fac8e809a6a4c161c12cc37b7 (diff)
downloadegawk-57dfae2cdd29002643719cfb42b42aeb50e57bfe.tar.gz
egawk-57dfae2cdd29002643719cfb42b42aeb50e57bfe.tar.bz2
egawk-57dfae2cdd29002643719cfb42b42aeb50e57bfe.zip
Merge branch 'gawk-4.1-stable'
-rw-r--r--ChangeLog16
-rw-r--r--awk.h1
-rw-r--r--awkgram.c9
-rw-r--r--awkgram.y9
-rw-r--r--debug.c17
-rw-r--r--io.c3
-rw-r--r--test/ChangeLog7
-rw-r--r--test/Makefile.am10
-rw-r--r--test/Makefile.in18
-rw-r--r--test/Maketests8
-rw-r--r--test/rsgetline.awk23
-rw-r--r--test/rsgetline.in1
-rw-r--r--test/rsgetline.ok3
13 files changed, 112 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index bb4a4b44..3a32a238 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2014-05-09 Arnold D. Robbins <arnold@skeeve.com>
+
+ * debug.c (do_eval): Don't free `f' which points into the context
+ that was previously freed. Bug reported by Jan Chaloupka
+ <jchaloup@redhat.com>. Apparently introduced with move to
+ SYMTAB and FUNCTAB, but only showed up on Fedora 20 and Ubuntu 14.04,
+ which have a newer glibc.
+ (do_eval): Fix a memory leak seen by valgrind on Fedora 20 and
+ Ubuntu 14.04: the new SRCFILE that is added wasn't released.
+
+ Unrelated:
+
+ * io.c (get_a_record): Handle return of TERMNEAREND when the
+ entire file has been read into the buffer and we're using a
+ regex for RS. Bug report by Grail Dane <grail69@hotmail.com>.
+
2014-05-04 Arnold D. Robbins <arnold@skeeve.com>
* debug.c (debug_prog): Change check for GAWK_RESTART so that it
diff --git a/awk.h b/awk.h
index aefdd072..9255b45b 100644
--- a/awk.h
+++ b/awk.h
@@ -1373,6 +1373,7 @@ extern NODE *stopme(int nargs);
extern void shadow_funcs(void);
extern int check_special(const char *name);
extern SRCFILE *add_srcfile(enum srctype stype, char *src, SRCFILE *curr, bool *already_included, int *errcode);
+extern void free_srcfile(SRCFILE *thisfile);
extern void register_deferred_variable(const char *name, NODE *(*load_func)(void));
extern int files_are_same(char *path, SRCFILE *src);
extern void valinfo(NODE *n, Func_print print_func, FILE *fp);
diff --git a/awkgram.c b/awkgram.c
index 80d6ea05..7d444fb8 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -4672,6 +4672,15 @@ parse_program(INSTRUCTION **pcode)
return (ret || errcount);
}
+/* free_srcfile --- free a SRCFILE struct */
+
+void
+free_srcfile(SRCFILE *thisfile)
+{
+ efree(thisfile->src);
+ efree(thisfile);
+}
+
/* do_add_srcfile --- add one item to srcfiles */
static SRCFILE *
diff --git a/awkgram.y b/awkgram.y
index 7d530b7f..07131d22 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -2333,6 +2333,15 @@ parse_program(INSTRUCTION **pcode)
return (ret || errcount);
}
+/* free_srcfile --- free a SRCFILE struct */
+
+void
+free_srcfile(SRCFILE *thisfile)
+{
+ efree(thisfile->src);
+ efree(thisfile);
+}
+
/* do_add_srcfile --- add one item to srcfiles */
static SRCFILE *
diff --git a/debug.c b/debug.c
index 84e69d47..32b308af 100644
--- a/debug.c
+++ b/debug.c
@@ -5448,6 +5448,7 @@ do_eval(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
int ecount = 0, pcount = 0;
int ret;
int save_flags = do_flags;
+ SRCFILE *the_source;
if (prog_running) {
this_frame = find_frame(0);
@@ -5458,7 +5459,7 @@ do_eval(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
ctxt = new_context();
ctxt->install_func = append_symbol; /* keep track of newly installed globals */
push_context(ctxt);
- (void) add_srcfile(SRC_CMDLINE, arg->a_string, srcfiles, NULL, NULL);
+ the_source = add_srcfile(SRC_CMDLINE, arg->a_string, srcfiles, NULL, NULL);
do_flags = false;
ret = parse_program(&code);
do_flags = save_flags;
@@ -5565,8 +5566,18 @@ do_eval(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
pop_context(); /* switch to prev context */
free_context(ctxt, (ret_val != NULL)); /* free all instructions and optionally symbols */
- if (ret_val != NULL)
- destroy_symbol(f); /* destroy "@eval" */
+
+ /*
+ * May 2014:
+ * Don't do this. f points into the context we just released.
+ * Only showed up on Fedora 20 / Ubuntu 14.04.
+ *
+ * if (ret_val != NULL)
+ * destroy_symbol(f); // destroy "@eval"
+ */
+
+ free_srcfile(the_source);
+
return false;
}
diff --git a/io.c b/io.c
index 2bb8f28a..b1c9fa18 100644
--- a/io.c
+++ b/io.c
@@ -206,6 +206,7 @@ typedef enum { CLOSE_ALL, CLOSE_TO, CLOSE_FROM } two_way_close_type;
#define at_eof(iop) (((iop)->flag & IOP_AT_EOF) != 0)
#define has_no_data(iop) ((iop)->dataend == NULL)
#define no_data_left(iop) ((iop)->off >= (iop)->dataend)
+#define buffer_has_all_data(iop) ((iop)->dataend - (iop)->off == (iop)->public.sbuf.st_size)
/*
* The key point to the design is to split out the code that searches through
@@ -3474,6 +3475,8 @@ get_a_record(char **out, /* pointer to pointer to data */
iop->flag &= ~IOP_AT_START;
if (ret == REC_OK)
break;
+ if (ret == TERMNEAREND && buffer_has_all_data(iop))
+ break;
/* need to add more data to buffer */
/* shift data down in buffer */
diff --git a/test/ChangeLog b/test/ChangeLog
index 6d4cd1c2..878766c7 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,10 @@
+2014-05-09 Andrew J. Schorr <aschorr@telemetry-investments.com>
+
+ * Makefile.am (rebuf): Force buffer size to 4096 via AWKBUFSIZE
+ environment variable.
+ (rsgetline): New test.
+ * rsgetline.awk, rsgetline.in, rsgetline.ok: New files.
+
2014-04-11 Arnold D. Robbins <arnold@skeeve.com>
* Makefile.am (charset-msg-start): Add a warning message that tests
diff --git a/test/Makefile.am b/test/Makefile.am
index 238f2ed7..ba6bbeec 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -759,6 +759,9 @@ EXTRA_DIST = \
rs.awk \
rs.in \
rs.ok \
+ rsgetline.awk \
+ rsgetline.in \
+ rsgetline.ok \
rsnul1nl.awk \
rsnul1nl.in \
rsnul1nl.ok \
@@ -1000,7 +1003,7 @@ GAWK_EXT_TESTS = \
nastyparm next nondec nondec2 \
patsplit posix printfbad1 printfbad2 printfbad3 procinfs \
profile1 profile2 profile3 profile4 profile5 pty1 \
- rebuf regx8bit reginttrad reint reint2 rsstart1 \
+ rebuf regx8bit reginttrad reint reint2 rsgetline rsstart1 \
rsstart2 rsstart3 rstest6 shadow sortfor sortu split_after_fpat \
splitarg4 strftime \
strtonum switch2 symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 \
@@ -1329,6 +1332,11 @@ fmtspcl: fmtspcl.ok
$(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
fi
+rebuf::
+ @echo $@
+ @AWKBUFSIZE=4096 AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
reint::
@echo $@
@$(AWK) --re-interval -f "$(srcdir)"/reint.awk "$(srcdir)"/reint.in >_$@
diff --git a/test/Makefile.in b/test/Makefile.in
index 0831c597..b192b561 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -1005,6 +1005,9 @@ EXTRA_DIST = \
rs.awk \
rs.in \
rs.ok \
+ rsgetline.awk \
+ rsgetline.in \
+ rsgetline.ok \
rsnul1nl.awk \
rsnul1nl.in \
rsnul1nl.ok \
@@ -1245,7 +1248,7 @@ GAWK_EXT_TESTS = \
nastyparm next nondec nondec2 \
patsplit posix printfbad1 printfbad2 printfbad3 procinfs \
profile1 profile2 profile3 profile4 profile5 pty1 \
- rebuf regx8bit reginttrad reint reint2 rsstart1 \
+ rebuf regx8bit reginttrad reint reint2 rsgetline rsstart1 \
rsstart2 rsstart3 rstest6 shadow sortfor sortu split_after_fpat \
splitarg4 strftime \
strtonum switch2 symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 \
@@ -1754,6 +1757,11 @@ fmtspcl: fmtspcl.ok
$(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
fi
+rebuf::
+ @echo $@
+ @AWKBUFSIZE=4096 AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
reint::
@echo $@
@$(AWK) --re-interval -f "$(srcdir)"/reint.awk "$(srcdir)"/reint.in >_$@
@@ -3498,14 +3506,14 @@ pty1:
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
-rebuf:
+regx8bit:
@echo $@
- @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
-regx8bit:
+rsgetline:
@echo $@
- @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
rstest6:
diff --git a/test/Maketests b/test/Maketests
index b9b713c4..e847d765 100644
--- a/test/Maketests
+++ b/test/Maketests
@@ -1152,14 +1152,14 @@ pty1:
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
-rebuf:
+regx8bit:
@echo $@
- @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
-regx8bit:
+rsgetline:
@echo $@
- @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
rstest6:
diff --git a/test/rsgetline.awk b/test/rsgetline.awk
new file mode 100644
index 00000000..fa327fcf
--- /dev/null
+++ b/test/rsgetline.awk
@@ -0,0 +1,23 @@
+# Date: Sun, 4 May 2014 18:09:01 +0200
+# From: Davide Brini <dave_br@gmx.com>
+# To: bug-gawk@gnu.org
+# Subject: Re: [bug-gawk] Computed regex and getline bug / issue
+#
+# I have been able to reduce the behavior to these simple test cases, which
+# (unless I'm missing something obvious) should behave identically but don't:
+#
+# $ printf '1,2,' | gawk 'BEGIN{RS="[,]+"}{print; a = getline; print "-"a"-"; print}'
+# 1
+# -0-
+# 1
+
+BEGIN {
+ RS = "[,]+"
+}
+
+{
+ printf "[%s] [%s]\n", $0, RT
+ a = getline
+ print "-"a"-"
+ printf "[%s] [%s]\n", $0, RT
+}
diff --git a/test/rsgetline.in b/test/rsgetline.in
new file mode 100644
index 00000000..f1782346
--- /dev/null
+++ b/test/rsgetline.in
@@ -0,0 +1 @@
+1,2, \ No newline at end of file
diff --git a/test/rsgetline.ok b/test/rsgetline.ok
new file mode 100644
index 00000000..1388369a
--- /dev/null
+++ b/test/rsgetline.ok
@@ -0,0 +1,3 @@
+[1] [,]
+-1-
+[2] [,]