summaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2019-01-10 17:52:38 +0000
committerPedro Alves <palves@redhat.com>2019-01-10 17:52:38 +0000
commit36cb72375cc371b786ceaec588ec26f8c55ae2ec (patch)
treec0e9803a737866f7a77956e9181a5b62bac0ed87 /gdb
parentda584958006fd0a3f3dccd25a0a54fa79a0976bc (diff)
downloadbinutils-gdb-36cb72375cc371b786ceaec588ec26f8c55ae2ec.tar.gz
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')
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/mdebugread.c23
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 <palves@redhat.com>
+
+ * mdebugread.c (parse_partial_symbols): Use
+ gdb::unique_xmalloc_ptr to manage heap-allocated 'stabsstring'.
+
2019-01-10 Andrew Burgess <andrew.burgess@embecosm.com>
* 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<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 */
}