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);
}