From e2234c97c20e49cab370d74f4eacdfe606bd490a Mon Sep 17 00:00:00 2001 From: Florian Krohm Date: Fri, 12 Sep 2014 20:53:43 +0000 Subject: [PATCH] Fix a memory leak found by IBM's BEAM checker. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14527 --- memcheck/mc_errors.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/memcheck/mc_errors.c b/memcheck/mc_errors.c index c5f18fe8cd..e6a2133b28 100644 --- a/memcheck/mc_errors.c +++ b/memcheck/mc_errors.c @@ -1351,22 +1351,29 @@ Bool MC_(read_extra_suppression_info) ( Int fd, HChar** bufpp, } } 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); } -- 2.47.2