From 36cb72375cc371b786ceaec588ec26f8c55ae2ec Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Thu, 10 Jan 2019 17:52:38 +0000 Subject: [PATCH] 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/ChangeLog | 5 +++++ gdb/mdebugread.c | 23 ++++++++++++++--------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dcd90144356..b651980a3f0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2019-01-10 Pedro Alves + + * mdebugread.c (parse_partial_symbols): Use + gdb::unique_xmalloc_ptr to manage heap-allocated 'stabsstring'. + 2019-01-10 Andrew Burgess * linux-fork.c (scoped_switch_fork_info) diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index 150cd16f349..63cbb3027b3 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 */ } -- 2.30.2