From 36cb72375cc371b786ceaec588ec26f8c55ae2ec Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Thu, 10 Jan 2019 17:52:38 +0000 Subject: Fix leak in mdebugread.c Coverity points out that all the "continue;" statements in the switch case in parse_partial_symbols leak STABSTRING. This is because we only release STABSTRING at the end of the scope, with: if (stabstring && stabstring != debug_info->ss + fh->issBase + sh.iss) xfree (stabstring); but that bit of code is skipped if a case in the switch statement ends with "continue". Fix this by using gdb::unique_xmalloc_ptr to manage the heap-allocated version of 'stabsstring'. I don't know how to test this. gdb/ChangeLog: 2019-01-10 Pedro Alves * mdebugread.c (parse_partial_symbols): Use gdb::unique_xmalloc_ptr to manage heap-allocated 'stabsstring'. --- gdb/mdebugread.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'gdb/mdebugread.c') diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index 150cd16..63cbb30 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -2765,6 +2765,9 @@ parse_partial_symbols (minimal_symbol_reader &reader, /* Handle stabs continuation. */ { char *stabstring = debug_info->ss + fh->issBase + sh.iss; + /* If we need to heap-allocate STABSTRING, this owns + it. */ + gdb::unique_xmalloc_ptr stabstring_storage; int len = strlen (stabstring); while (stabstring[len - 1] == '\\') @@ -2787,14 +2790,19 @@ parse_partial_symbols (minimal_symbol_reader &reader, stabstring2 = debug_info->ss + fh->issBase + sh2.iss; len2 = strlen (stabstring2); - /* Concatinate stabstring2 with stabstring1. */ - if (stabstring - && stabstring != debug_info->ss + fh->issBase + sh.iss) - stabstring - = (char *) xrealloc (stabstring, len + len2 + 1); + /* Concatenate stabstring2 with stabstring1. */ + if (stabstring_storage != nullptr) + { + stabstring_storage.reset + ((char *) xrealloc (stabstring_storage.release (), + len + len2 + 1)); + stabstring = stabstring_storage.get (); + } else { - stabstring = (char *) xmalloc (len + len2 + 1); + stabstring_storage.reset + ((char *) xmalloc (len + len2 + 1)); + stabstring = stabstring_storage.get (); strcpy (stabstring, stabstring1); } strcpy (stabstring + len, stabstring2); @@ -3330,9 +3338,6 @@ parse_partial_symbols (minimal_symbol_reader &reader, hex_string (type_code)); /* CUR_SYMBOL_TYPE */ continue; } - if (stabstring - && stabstring != debug_info->ss + fh->issBase + sh.iss) - xfree (stabstring); } /* end - Handle continuation */ } -- cgit v1.1