summaryrefslogtreecommitdiff
path: root/posix
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@redhat.com>2010-11-12 03:51:28 -0500
committerUlrich Drepper <drepper@gmail.com>2010-11-12 03:51:28 -0500
commit3540d66b669af54900b2e4bfc0ab82960e84a471 (patch)
tree2798b4dfa450db317e823ab8af0c2cdb2f340fa2 /posix
parent13b695749acf88139a2ce1ed2c949e0e64300a9b (diff)
Fix memory leak in fnmatch
Diffstat (limited to 'posix')
-rw-r--r--posix/Makefile10
-rw-r--r--posix/fnmatch_loop.c8
-rw-r--r--posix/tst-fnmatch.c5
3 files changed, 15 insertions, 8 deletions
diff --git a/posix/Makefile b/posix/Makefile
index 356896f7cc..373e50b0a9 100644
--- a/posix/Makefile
+++ b/posix/Makefile
@@ -115,7 +115,8 @@ generated := $(addprefix wordexp-test-result, 1 2 3 4 5 6 7 8 9 10) \
tst-rxspencer-mem tst-rxspencer.mtrace tst-getconf.out \
tst-pcre-mem tst-pcre.mtrace tst-boost-mem tst-boost.mtrace \
bug-ga2.mtrace bug-ga2-mem bug-glob2.mtrace bug-glob2-mem \
- tst-vfork3-mem tst-vfork3.mtrace getconf.speclist
+ tst-vfork3-mem tst-vfork3.mtrace getconf.speclist \
+ tst-fnmatch-mem tst-fnmatch.mtrace
include ../Rules
@@ -235,7 +236,7 @@ ifeq (no,$(cross-compiling))
tests: $(objpfx)bug-regex2-mem $(objpfx)bug-regex14-mem \
$(objpfx)bug-regex21-mem $(objpfx)bug-regex31-mem $(objpfx)tst-rxspencer-mem\
$(objpfx)tst-pcre-mem $(objpfx)tst-boost-mem $(objpfx)tst-getconf.out \
- $(objpfx)bug-glob2-mem $(objpfx)tst-vfork3-mem
+ $(objpfx)bug-glob2-mem $(objpfx)tst-vfork3-mem $(objpfx)tst-fnmatch-mem
xtests: $(objpfx)bug-ga2-mem
endif
@@ -247,6 +248,11 @@ annexc-CFLAGS = -O
$(objpfx)annexc: annexc.c
$(native-compile)
+tst-fnmatch-ENV += MALLOC_TRACE=$(objpfx)tst-fnmatch.mtrace
+
+$(objpfx)tst-fnmatch-mem: $(objpfx)tst-fnmatch.out
+ $(common-objpfx)malloc/mtrace $(objpfx)tst-fnmatch.mtrace > $@
+
bug-regex2-ENV = MALLOC_TRACE=$(objpfx)bug-regex2.mtrace
$(objpfx)bug-regex2-mem: $(objpfx)bug-regex2.out
diff --git a/posix/fnmatch_loop.c b/posix/fnmatch_loop.c
index c8e52a6b4d..6b0224ea2c 100644
--- a/posix/fnmatch_loop.c
+++ b/posix/fnmatch_loop.c
@@ -1114,18 +1114,16 @@ EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end,
int malloced = ! __libc_use_alloca (alloca_used + slen); \
if (__builtin_expect (malloced, 0)) \
{ \
- newp = alloca_account (slen, alloca_used); \
- any_malloced = 1; \
- } \
- else \
- { \
newp = malloc (slen); \
if (newp == NULL) \
{ \
retval = -2; \
goto out; \
} \
+ any_malloced = 1; \
} \
+ else \
+ newp = alloca_account (slen, alloca_used); \
newp->next = NULL; \
newp->malloced = malloced; \
*((CHAR *) MEMPCPY (newp->str, startp, p - startp)) = L('\0'); \
diff --git a/posix/tst-fnmatch.c b/posix/tst-fnmatch.c
index 25471f8e41..7e1f73a975 100644
--- a/posix/tst-fnmatch.c
+++ b/posix/tst-fnmatch.c
@@ -1,5 +1,5 @@
/* Tests for fnmatch function.
- Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -25,6 +25,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
+#include <mcheck.h>
static char *next_input (char **line, int first, int last);
@@ -46,6 +47,8 @@ main (void)
size_t escpatternlen = 0;
int nr = 0;
+ mtrace ();
+
/* Read lines from stdin with the following format:
locale input-string match-string flags result