Fix a memory leak found by IBM's BEAM checker.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14527 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/memcheck/mc_errors.c b/memcheck/mc_errors.c
index c5f18fe..e6a2133 100644
--- a/memcheck/mc_errors.c
+++ b/memcheck/mc_errors.c
@@ -1351,22 +1351,29 @@
       }
    } else if (VG_(get_supp_kind)(su) == FishyValueSupp) {
       MC_FishyValueExtra *extra;
-      HChar *p;
+      HChar *p, *function_name, *argument_name = NULL;
 
       eof = VG_(get_line) ( fd, bufpp, nBufp, lineno );
       if (eof) return True;
 
-      extra = VG_(malloc)("mc.resi.3", sizeof *extra);
-      extra->function_name = VG_(strdup)("mv.resi.4", *bufpp);
-
       // The suppression string is: function_name(argument_name)
-      p = VG_(strchr)(extra->function_name, '(');
-      if (p == NULL) return False;  // malformed suppression string
-      *p++ = '\0';
-      extra->argument_name = p;
-      p = VG_(strchr)(p, ')');
-      if (p == NULL) return False;  // malformed suppression string
-      *p = '\0';
+      function_name = VG_(strdup)("mv.resi.4", *bufpp);
+      p = VG_(strchr)(function_name, '(');
+      if (p != NULL) {
+         *p++ = '\0';
+         argument_name = p;
+         p = VG_(strchr)(p, ')');
+         if (p != NULL)
+            *p = '\0';
+      }
+      if (p == NULL) {    // malformed suppression string
+         VG_(free)(function_name);
+         return False;
+      }
+
+      extra = VG_(malloc)("mc.resi.3", sizeof *extra);
+      extra->function_name = function_name;
+      extra->argument_name = argument_name;
 
       VG_(set_supp_extra)(su, extra);
    }