Make it possible to suppress, and auto-generate suppressions for,
"User" errors; that is, errors resulting from client requests (check
memory range is addressible / defined).



git-svn-id: svn://svn.valgrind.org/valgrind/trunk@6374 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/memcheck/mc_main.c b/memcheck/mc_main.c
index fb6706c..f9ccd03 100644
--- a/memcheck/mc_main.c
+++ b/memcheck/mc_main.c
@@ -2648,6 +2648,7 @@
 typedef 
    enum { 
       ParamSupp,     // Bad syscall params
+      UserSupp,      // Errors arising from client-request checks
       CoreMemSupp,   // Memory errors in core (pthread ops, signal handling)
 
       // Use of invalid values of given size (MemCheck only)
@@ -3357,6 +3358,7 @@
    SuppKind skind;
 
    if      (VG_STREQ(name, "Param"))   skind = ParamSupp;
+   else if (VG_STREQ(name, "User"))    skind = UserSupp;
    else if (VG_STREQ(name, "CoreMem")) skind = CoreMemSupp;
    else if (VG_STREQ(name, "Addr1"))   skind = Addr1Supp;
    else if (VG_STREQ(name, "Addr2"))   skind = Addr2Supp;
@@ -3406,6 +3408,9 @@
               && VG_STREQ(VG_(get_error_string)(err), 
                           VG_(get_supp_string)(su)));
 
+      case UserSupp:
+         return (ekind == UserErr);
+
       case CoreMemSupp:
          return (ekind == CoreMemErr
               && VG_STREQ(VG_(get_error_string)(err),
@@ -3454,7 +3459,7 @@
    Char* s;
    switch (VG_(get_error_kind)(err)) {
    case ParamErr:           return "Param";
-   case UserErr:            return NULL;  /* Can't suppress User errors */
+   case UserErr:            return "User";
    case FreeMismatchErr:    return "Free";
    case IllegalMempoolErr:  return "Mempool";
    case FreeErr:            return "Free";