This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Fix leak in mdebugread.c


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=36cb72375cc371b786ceaec588ec26f8c55ae2ec

commit 36cb72375cc371b786ceaec588ec26f8c55ae2ec
Author: Pedro Alves <palves@redhat.com>
Date:   Thu Jan 10 17:52:38 2019 +0000

    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'.

Diff:
---
 gdb/ChangeLog    |  5 +++++
 gdb/mdebugread.c | 23 ++++++++++++++---------
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index dcd9014..b651980 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 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 */
 	    }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]