ct->expression gets overwritten with each call to strmake. Save its address in a temporary variable inorder to free it later on and avoid a memory leak
Signed-off-by: David Kahurani k.kahurani@gmail.com --- tools/winedump/msmangle.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/tools/winedump/msmangle.c b/tools/winedump/msmangle.c index cf26a07..5ccf430 100644 --- a/tools/winedump/msmangle.c +++ b/tools/winedump/msmangle.c @@ -533,7 +533,6 @@ static char *demangle_datatype (char **str, compound_type *ct, if (*iter == '6') { int sub_expressions = 0; - /* FIXME: there are tons of memory leaks here */ /* FIXME: this is still broken in some cases and it has to be * merged with the function prototype parsing above... */ @@ -550,15 +549,21 @@ static char *demangle_datatype (char **str, compound_type *ct, if (!demangle_datatype (&iter, &sub_ct, sym)) return NULL; if (sub_expressions) + char *tmp = ct->expression; ct->expression = strmake( "%s, %s", ct->expression, sub_ct.expression ); + free(tmp); else + char *tmp = ct->expression; ct->expression = strmake( "%s%s", ct->expression, sub_ct.expression ); + free(tmp); while (*iter == '@') iter++; sub_expressions++; } } else while (*iter == '@') iter++; iter++; + char *tmp = ct->expression; ct->expression = strmake( "%s)", ct->expression ); + free(tmp); } else return NULL;