Don't silently ignore any suppression contexts beyond the 4th -- instead abort
with a warning.  Addresses part of bug #77922.

MERGE TO STABLE


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2946 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/vg_errcontext.c b/coregrind/vg_errcontext.c
index 5a2274e..f69cc4b 100644
--- a/coregrind/vg_errcontext.c
+++ b/coregrind/vg_errcontext.c
@@ -787,7 +787,7 @@
 {
 #  define N_BUF 200
    Int   fd, i;
-   Bool  eof;
+   Bool  eof, too_many_contexts = False;
    Char  buf[N_BUF+1];
    Char* tool_names;
    Char* supp_name;
@@ -883,9 +883,13 @@
       /* make sure to grab the '}' if the num callers is >=
          VG_N_SUPP_CALLERS */
       if (!VG_STREQ(buf, "}")) {
-         do {
-           eof = VG_(get_line) ( fd, buf, N_BUF );
-        } while (!eof && !VG_STREQ(buf, "}"));
+         // Don't just ignore extra lines -- abort.  (Someone complained
+         // about silent ignoring of lines in bug #77922.)
+         //do {
+         //   eof = VG_(get_line) ( fd, buf, N_BUF );
+         //} while (!eof && !VG_STREQ(buf, "}"));
+         too_many_contexts = True;
+         goto syntax_error;
       }
 
       supp->next = vg_suppressions;
@@ -899,6 +903,13 @@
       VG_(message)(Vg_UserMsg, 
                    "FATAL: in suppressions file `%s': unexpected EOF", 
                    filename );
+   } else if (too_many_contexts) {
+      VG_(message)(Vg_UserMsg, 
+                   "FATAL: in suppressions file: `%s': at %s:", 
+                   filename, buf );
+      VG_(message)(Vg_UserMsg, 
+                   "too many lines (limit of %d contexts in suppressions)",
+                   VG_N_SUPP_CALLERS);
    } else {
       VG_(message)(Vg_UserMsg, 
                    "FATAL: in suppressions file: `%s': syntax error on: %s", 
@@ -906,7 +917,7 @@
    }
    VG_(close)(fd);
    VG_(message)(Vg_UserMsg, "exiting now.");
-    VG_(exit)(1);
+   VG_(exit)(1);
 
 #  undef N_BUF   
 }