Fix false assertion in pattern matching.
MERGED FROM CVS HEAD
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3279 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/vg_mylibc.c b/coregrind/vg_mylibc.c
index 15444df..13480b1 100644
--- a/coregrind/vg_mylibc.c
+++ b/coregrind/vg_mylibc.c
@@ -1074,7 +1074,8 @@
recDepth++;
for (;;) {
switch (*pat) {
- case '\0' : return (*str=='\0');
+ case '\0' : recDepth--;
+ return (*str=='\0');
case '*' : do {
if (string_match_wrk(pat+1,str)) {
recDepth--;
@@ -1108,6 +1109,7 @@
Bool b;
recDepth = 0;
b = string_match_wrk ( pat, str );
+ vg_assert(recDepth == 0);
/*
VG_(printf)("%s %s %s\n",
b?"TRUE ":"FALSE", pat, str);
diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am
index b90dd12..10de7e7 100644
--- a/memcheck/tests/Makefile.am
+++ b/memcheck/tests/Makefile.am
@@ -45,6 +45,7 @@
manuel1.stderr.exp manuel1.stdout.exp manuel1.vgtest \
manuel2.stderr.exp manuel2.stdout.exp manuel2.vgtest \
manuel3.stderr.exp manuel3.vgtest \
+ match-overrun.stderr.exp match-overrun.vgtest match-overrun.supp \
memalign_test.stderr.exp memalign_test.vgtest \
memalign2.stderr.exp memalign2.vgtest \
memcmptest.stderr.exp memcmptest.stdout.exp memcmptest.vgtest \
@@ -96,6 +97,7 @@
fprw fwrite hello inits inline \
leak-0 leak-cycle leak-tree leak-regroot leakotron \
malloc1 malloc2 malloc3 manuel1 manuel2 manuel3 \
+ match-overrun \
memalign_test memalign2 memcmptest mempool mmaptest \
nanoleak new_nothrow \
null_socket overlap \
@@ -151,6 +153,7 @@
manuel1_SOURCES = manuel1.c
manuel2_SOURCES = manuel2.c
manuel3_SOURCES = manuel3.c
+match_overrun_SOURCES = match-overrun.c
mmaptest_SOURCES = mmaptest.c
memalign_test_SOURCES = memalign_test.c
memalign2_SOURCES = memalign2.c
diff --git a/memcheck/tests/match-overrun.c b/memcheck/tests/match-overrun.c
new file mode 100644
index 0000000..4c618fb
--- /dev/null
+++ b/memcheck/tests/match-overrun.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+static int a1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789(void)
+{
+ return *(int *)0;
+}
+
+int main(int argc, char **argv)
+{
+ exit(a1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789());
+}
diff --git a/memcheck/tests/match-overrun.stderr.exp b/memcheck/tests/match-overrun.stderr.exp
new file mode 100644
index 0000000..7830fd8
--- /dev/null
+++ b/memcheck/tests/match-overrun.stderr.exp
@@ -0,0 +1,13 @@
+
+
+Process terminating with default action of signal 11 (SIGSEGV)
+ Access not within mapped region at address 0x........
+ at 0x........: a1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 (match-overrun.c:6)
+ by 0x........: __libc_start_main (in /...libc...)
+ by 0x........: ...
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
+malloc/free: in use at exit: 0 bytes in 0 blocks.
+malloc/free: 0 allocs, 0 frees, 0 bytes allocated.
+For a detailed leak analysis, rerun with: --leak-check=yes
+For counts of detected errors, rerun with: -v
diff --git a/memcheck/tests/match-overrun.supp b/memcheck/tests/match-overrun.supp
new file mode 100644
index 0000000..e69ec8a
--- /dev/null
+++ b/memcheck/tests/match-overrun.supp
@@ -0,0 +1,5 @@
+{
+ test
+ Memcheck:Addr4
+ fun:a123456789*
+}
diff --git a/memcheck/tests/match-overrun.vgtest b/memcheck/tests/match-overrun.vgtest
new file mode 100644
index 0000000..a5baa9d
--- /dev/null
+++ b/memcheck/tests/match-overrun.vgtest
@@ -0,0 +1,2 @@
+prog: match-overrun
+vgopts: --suppressions=match-overrun.supp