From 240e87c2300c25b1cc8a78cccc2293874d89c67e Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Thu, 24 Oct 2002 00:22:27 +0000 Subject: [PATCH] * posix/regcomp.c (re_comp): Call __regfree on re_comp_buf. (free_mem): New function. * posix/Makefile (tests): Add bug-regex14. Add bug-regex14-mem if not cross compiling. (generated): Add bug-regex14-mem and bug-regex14.mtrace. (bug-regex14-ENV): Set. (bug-regex14-mem): New target. * posix/bug-regex14.c: New file. * elf/Makefile ($(objpfx)librtld.map): Use temporary file for output target, so we don't touch it when the link fails. --- ChangeLog | 14 ++++++++++++ elf/Makefile | 4 +++- posix/Makefile | 12 +++++++--- posix/bug-regex14.c | 54 +++++++++++++++++++++++++++++++++++++++++++++ posix/regcomp.c | 23 ++++++++++++++++++- 5 files changed, 102 insertions(+), 5 deletions(-) create mode 100644 posix/bug-regex14.c diff --git a/ChangeLog b/ChangeLog index c68f8a671e..6bac4d5f02 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,19 @@ +2002-10-24 Jakub Jelinek + + * posix/regcomp.c (re_comp): Call __regfree on re_comp_buf. + (free_mem): New function. + * posix/Makefile (tests): Add bug-regex14. Add bug-regex14-mem + if not cross compiling. + (generated): Add bug-regex14-mem and bug-regex14.mtrace. + (bug-regex14-ENV): Set. + (bug-regex14-mem): New target. + * posix/bug-regex14.c: New file. + 2002-10-23 Roland McGrath + * elf/Makefile ($(objpfx)librtld.map): Use temporary file for output + target, so we don't touch it when the link fails. + * libio/ftello.c (ftello): Use _IO_off64_t for type of POS. Check for the result overflowing off_t and fail with EOVERFLOW. * libio/ioftell.c (_IO_ftell): Likewise. diff --git a/elf/Makefile b/elf/Makefile index f490b2587d..015352275c 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -188,8 +188,10 @@ $(objpfx)dl-allobjs.os: $(all-rtld-routines:%=$(objpfx)%.os) # for us. Then we do the real link using rtld-libc.a instead of libc_pic.a. $(objpfx)librtld.map: $(objpfx)dl-allobjs.os $(common-objpfx)libc_pic.a - $(reloc-link) -o $@.o '-Wl,-(' $^ -lgcc '-Wl,-)' -Wl,-Map,$@ + @-rm -f $@T + $(reloc-link) -o $@.o '-Wl,-(' $^ -lgcc '-Wl,-)' -Wl,-Map,$@T rm -f $@.o + mv -f $@T $@ $(objpfx)librtld.mk: $(objpfx)librtld.map Makefile sed -n 's@^$(common-objpfx)\([^(]*\)(\(.*.os\))$$@\1 \2@p' $< | \ diff --git a/posix/Makefile b/posix/Makefile index 0062d982fb..37f6eccd19 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -75,7 +75,7 @@ tests := tstgetopt testfnm runtests runptests \ tst-chmod bug-regex1 bug-regex2 bug-regex3 bug-regex4 \ tst-gnuglob tst-regex bug-regex5 bug-regex6 bug-regex7 \ bug-regex8 bug-regex9 bug-regex10 bug-regex11 bug-regex12 \ - bug-regex13 + bug-regex13 bug-regex14 ifeq (yes,$(build-shared)) test-srcs := globtest tests += wordexp-test tst-exec tst-spawn @@ -89,7 +89,8 @@ before-compile := testcases.h ptestcases.h # So they get cleaned up. generated := $(addprefix wordexp-test-result, 1 2 3 4 5 6 7 8 9 10) \ annexc annexc.out wordexp-tst.out bug-regex2-mem \ - bug-regex2.mtrace tst-getconf.out + bug-regex2.mtrace bug-regex14-mem bug-regex14.mtrace \ + tst-getconf.out include ../Rules @@ -149,7 +150,7 @@ endif # XXX Please note that for now we ignore the result of this test. tests: $(objpfx)annexc.out ifeq (no,$(cross-compiling)) -tests:$(objpfx)bug-regex2-mem $(objpfx)tst-getconf.out +tests:$(objpfx)bug-regex2-mem $(objpfx)bug-regex14-mem $(objpfx)tst-getconf.out endif $(objpfx)annexc.out: $(objpfx)annexc @@ -165,6 +166,11 @@ bug-regex2-ENV = MALLOC_TRACE=$(objpfx)bug-regex2.mtrace $(objpfx)bug-regex2-mem: $(objpfx)bug-regex2.out $(common-objpfx)malloc/mtrace $(objpfx)bug-regex2.mtrace > $@ +bug-regex14-ENV = MALLOC_TRACE=$(objpfx)bug-regex14.mtrace + +$(objpfx)bug-regex14-mem: $(objpfx)bug-regex14.out + $(common-objpfx)malloc/mtrace $(objpfx)bug-regex14.mtrace > $@ + $(objpfx)tst-getconf.out: tst-getconf.sh $(objpfx)getconf $(SHELL) -e $< $(common-objpfx) $(elf-objpfx) $(rtld-installed-name) diff --git a/posix/bug-regex14.c b/posix/bug-regex14.c new file mode 100644 index 0000000000..91ff32a747 --- /dev/null +++ b/posix/bug-regex14.c @@ -0,0 +1,54 @@ +/* Tests re_comp and re_exec. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Isamu Hasegawa , 2002. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#define _REGEX_RE_COMP +#include +#include +#include +#include +#include + +int +main (void) +{ + const char *err; + size_t i; + int ret = 0; + + mtrace (); + + for (i = 0; i < 100; ++i) + { + err = re_comp ("a t.st"); + if (err) + { + printf ("re_comp failed: %s\n", err); + ret = 1; + } + + if (! re_exec ("This is a test.")) + { + printf ("re_exec failed\n"); + ret = 1; + } + } + + return ret; +} diff --git a/posix/regcomp.c b/posix/regcomp.c index 497d1301df..9bb06aa7bf 100644 --- a/posix/regcomp.c +++ b/posix/regcomp.c @@ -653,6 +653,7 @@ re_comp (s) const char *s; { reg_errcode_t ret; + char *fastmap; if (!s) { @@ -661,7 +662,17 @@ re_comp (s) return 0; } - if (!re_comp_buf.buffer) + if (re_comp_buf.buffer) + { + fastmap = re_comp_buf.fastmap; + re_comp_buf.fastmap = NULL; + __regfree (&re_comp_buf); + re_comp_buf.buffer = NULL; + re_comp_buf.allocated = 0; + re_comp_buf.fastmap = fastmap; + } + + if (re_comp_buf.fastmap == NULL) { re_comp_buf.fastmap = (char *) malloc (SBC_MAX); if (re_comp_buf.fastmap == NULL) @@ -683,6 +694,16 @@ re_comp (s) /* Yes, we're discarding `const' here if !HAVE_LIBINTL. */ return (char *) gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]); } + +#ifdef _LIBC +static void __attribute__ ((unused)) +free_mem (void) +{ + __regfree (&re_comp_buf); +} +text_set_element (__libc_subfreeres, free_mem); +#endif + #endif /* _REGEX_RE_COMP */ /* Internal entry point.