winedump: fix memory leak in msmangle.c (found by Smatch)

Lionel_Debroux lionel_debroux at yahoo.fr
Sat Sep 1 10:36:32 CDT 2007


symbol_demangle leaks some heap memory in ten error paths. Found
in Michael Stefaniuc's list of potential Wine bugs detected
by Smatch.


2007-09-01  Lionel Debroux <lionel_debroux at yahoo.fr>
       * tools/winedump/msmangle.c:
       winedump: fix memory leak in msmangle.c (found by Smatch).

-------------- next part --------------
>From 77d50d85f85705811f2d7c92c10b4e01ccb4b417 Mon Sep 17 00:00:00 2001
From: Lionel Debroux <lionel_debroux at yahoo.fr>
Date: Sat, 1 Sep 2007 15:09:34 +0200
Subject: winedump: fix memory leak in msmangle.c (found by Smatch).

---
 tools/winedump/msmangle.c |   12 +++++++++++-
 1 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/tools/winedump/msmangle.c b/tools/winedump/msmangle.c
index d9d99ef..ddb0c21 100644
--- a/tools/winedump/msmangle.c
+++ b/tools/winedump/msmangle.c
@@ -195,7 +195,7 @@ int symbol_demangle (parsed_symbol *sym)
       free (function_name);
       return -1;
     }
-    class_name = str_substring (class_name, name - 2);
+    class_name = str_substring (class_name, name - 2); /* Allocates a new string */
   }
 
   /* Function/Data type and access level */
@@ -218,6 +218,7 @@ int symbol_demangle (parsed_symbol *sym)
       if (VERBOSE)
         printf ("/*FIXME: %s: unknown data*/\n", sym->symbol);
       free (function_name);
+      free (class_name);
       return -1;
     }
     sym->flags |= SYM_DATA;
@@ -227,6 +228,7 @@ int symbol_demangle (parsed_symbol *sym)
     sym->arg_text[0] = str_create (3, ct.expression, " ", sym->arg_name[0]);
     FREE_CT (ct);
     free (function_name);
+    free (class_name);
     return 0;
 
   case '6' : /* compiler generated static */
@@ -242,9 +244,11 @@ int symbol_demangle (parsed_symbol *sym)
       if (VERBOSE)
         puts ("Demangled symbol OK [vtable]");
       free (function_name);
+      free (class_name);
       return 0;
     }
     free (function_name);
+    free (class_name);
     return -1;
 
   /* Functions */
@@ -289,6 +293,7 @@ int symbol_demangle (parsed_symbol *sym)
   /* FIXME: G,H / O,P / W,X are private / protected / public thunks */
   default:
     free (function_name);
+    free (class_name);
     return -1;
   }
 
@@ -303,6 +308,7 @@ int symbol_demangle (parsed_symbol *sym)
    case 'D': is_const = (CT_CONST | CT_VOLATILE); break;
    default:
     free (function_name);
+    free (class_name);
      return -1;
    }
   }
@@ -334,6 +340,7 @@ int symbol_demangle (parsed_symbol *sym)
     break;
   default:
     free (function_name);
+    free (class_name);
     return -1;
   }
 
@@ -349,6 +356,7 @@ int symbol_demangle (parsed_symbol *sym)
     INIT_CT (ct);
     if (!demangle_datatype (&name, &ct, sym)) {
       free (function_name);
+      free (class_name);
       return -1;
     }
     sym->return_text = ct.expression;
@@ -366,6 +374,7 @@ int symbol_demangle (parsed_symbol *sym)
       INIT_CT (ct);
       if (!demangle_datatype(&name, &ct, sym)) {
         free (function_name);
+        free (class_name);
         return -1;
       }
 
@@ -394,6 +403,7 @@ int symbol_demangle (parsed_symbol *sym)
    */
   if (*name != 'Z') {
     free (function_name);
+    free (class_name);
     return -1;
   }
 
-- 
1.4.4.4




More information about the wine-patches mailing list