Fix leak in mdebugread.c
authorPedro Alves <palves@redhat.com>
Thu, 10 Jan 2019 17:52:38 +0000 (17:52 +0000)
committerPedro Alves <palves@redhat.com>
Thu, 10 Jan 2019 17:52:38 +0000 (17:52 +0000)
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'.

gdb/ChangeLog
gdb/mdebugread.c

index dcd901443568ecdf50a4b16abdf290fc26955905..b651980a3f09c11a885d3a55b315aaf31bd47e47 100644 (file)
@@ -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)
index 150cd16f3497ba036082a797aeacd32d28130fe6..63cbb3027b36ca31f3aba14ab9d44beed6e0a3c4 100644 (file)
@@ -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 */
            }