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


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

commit 5b38f9c16e5b3f5f4b5d7772bfef59b1c97e2d05
Author: Philippe Waroquiers <philippe.waroquiers@skynet.be>
Date:   Mon Dec 31 18:07:26 2018 +0100

    Fix leak in print_one_catch_syscall.
    
    The last text produced was not freed, causing the below leak
    (e.g. in gdb.base/catch-syscall.exp):
    
    ==24970== 56 bytes in 12 blocks are definitely lost in loss record 626 of 3,289
    ==24970==    at 0x4C2BE6D: malloc (vg_replace_malloc.c:309)
    ==24970==    by 0x66B9C3F: __vasprintf_chk (vasprintf_chk.c:80)
    ==24970==    by 0x405181: vasprintf (stdio2.h:210)
    ==24970==    by 0x405181: xstrvprintf(char const*, __va_list_tag*) (common-utils.c:122)
    ==24970==    by 0x40524B: xstrprintf(char const*, ...) (common-utils.c:113)
    ==24970==    by 0x3B49DB: print_one_catch_syscall(breakpoint*, bp_location**) (break-catch-syscall.c:275)
    ==24970==    by 0x3C698F: print_one_breakpoint_location(breakpoint*, bp_location*, int, bp_location**, int) (breakpoint.c:6076)
    ==24970==    by 0x3C75B1: print_one_breakpoint(breakpoint*, bp_location**, int) (breakpoint.c:6373)
    ==24970==    by 0x3C7D0E: breakpoint_1(char const*, int, int (*)(breakpoint const*)) (breakpoint.c:6571)
    ==24970==    by 0x3C822C: info_breakpoints_command(char const*, int) (breakpoint.c:6625)
    
    2019-01-01  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
    
    	* break-catch-syscall.c (print_one_catch_syscall): xfree
    	the last text.

Diff:
---
 gdb/ChangeLog             |  5 +++++
 gdb/break-catch-syscall.c | 11 ++++++-----
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a2f6aac..2402d73 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2019-01-01  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
+
+	* break-catch-syscall.c (print_one_catch_syscall): xfree
+	the last text.
+
 2019-01-01  Joel Brobecker  <brobecker@adacore.com>
 
 	* top.c (print_gdb_version): Update Copyright year in version
diff --git a/gdb/break-catch-syscall.c b/gdb/break-catch-syscall.c
index 33018ec..6a911fb 100644
--- a/gdb/break-catch-syscall.c
+++ b/gdb/break-catch-syscall.c
@@ -265,7 +265,7 @@ print_one_catch_syscall (struct breakpoint *b,
 
       for (int iter : c->syscalls_to_be_caught)
         {
-          char *x = text;
+          char *previous_text = text;
           struct syscall s;
           get_syscall_by_number (gdbarch, iter, &s);
 
@@ -274,14 +274,15 @@ print_one_catch_syscall (struct breakpoint *b,
           else
             text = xstrprintf ("%s%d, ", text, iter);
 
-          /* We have to xfree the last 'text' (now stored at 'x')
-             because xstrprintf dynamically allocates new space for it
-             on every call.  */
-	  xfree (x);
+          /* We have to xfree previous_text because xstrprintf dynamically
+	     allocates new space for text on every call.  */
+	  xfree (previous_text);
         }
       /* Remove the last comma.  */
       text[strlen (text) - 2] = '\0';
       uiout->field_string ("what", text);
+      /* xfree last text.  */
+      xfree (text);
     }
   else
     uiout->field_string ("what", "<any syscall>");


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