From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5480 invoked by alias); 23 Oct 2002 23:58:49 -0000 Mailing-List: contact libc-hacker-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sources.redhat.com Received: (qmail 5464 invoked from network); 23 Oct 2002 23:58:48 -0000 Received: from unknown (HELO sunsite.mff.cuni.cz) (195.113.19.66) by sources.redhat.com with SMTP; 23 Oct 2002 23:58:48 -0000 Received: (from jakub@localhost) by sunsite.mff.cuni.cz (8.11.6/8.11.6) id g9NNwXv18470; Thu, 24 Oct 2002 01:58:33 +0200 Date: Wed, 23 Oct 2002 17:22:00 -0000 From: Jakub Jelinek To: Ulrich Drepper , Roland McGrath , Isamu Hasegawa Cc: Glibc hackers Subject: [PATCH] Fix re_comp Message-ID: <20021024015833.G3451@sunsite.ms.mff.cuni.cz> Reply-To: Jakub Jelinek Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-SW-Source: 2002-10/txt/msg00095.txt.bz2 Hi! This patch fixes massive memory leaks in re_comp (and also adds freeres for clean mtrace). 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 rule. * posix/bug-regex14.c: New test. --- libc/posix/Makefile.jj 2002-10-24 00:05:06.000000000 +0200 +++ libc/posix/Makefile 2002-10-24 00:29:32.000000000 +0200 @@ -74,7 +74,7 @@ tests := tstgetopt testfnm runtests run 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 @@ -88,7 +88,8 @@ before-compile := testcases.h ptestcases # 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 @@ -148,7 +149,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 @@ -164,6 +165,11 @@ bug-regex2-ENV = MALLOC_TRACE=$(objpfx)b $(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) --- libc/posix/bug-regex14.c.jj 2002-10-24 00:27:42.000000000 +0200 +++ libc/posix/bug-regex14.c 2002-10-24 00:24:34.000000000 +0200 @@ -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; +} --- libc/posix/regcomp.c.jj 2002-10-24 00:05:06.000000000 +0200 +++ libc/posix/regcomp.c 2002-10-24 00:50:28.000000000 +0200 @@ -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. Jakub