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