diff options
author | Pedro Alves <palves@redhat.com> | 2019-01-10 17:52:38 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2019-01-10 17:52:38 +0000 |
commit | 36cb72375cc371b786ceaec588ec26f8c55ae2ec (patch) | |
tree | c0e9803a737866f7a77956e9181a5b62bac0ed87 /gdb/mdebugread.c | |
parent | da584958006fd0a3f3dccd25a0a54fa79a0976bc (diff) | |
download | gdb-36cb72375cc371b786ceaec588ec26f8c55ae2ec.zip gdb-36cb72375cc371b786ceaec588ec26f8c55ae2ec.tar.gz gdb-36cb72375cc371b786ceaec588ec26f8c55ae2ec.tar.bz2 |
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 <palves@redhat.com>
* mdebugread.c (parse_partial_symbols): Use
gdb::unique_xmalloc_ptr to manage heap-allocated 'stabsstring'.
Diffstat (limited to 'gdb/mdebugread.c')
-rw-r--r-- | gdb/mdebugread.c | 23 |
1 files changed, 14 insertions, 9 deletions
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<char> 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 */ } |