Fix leak in event-top.c history expansion
authorPhilippe Waroquiers <philippe.waroquiers@skynet.be>
Sun, 20 Jan 2019 15:59:00 +0000 (16:59 +0100)
committerPhilippe Waroquiers <philippe.waroquiers@skynet.be>
Mon, 21 Jan 2019 20:19:13 +0000 (21:19 +0100)
E.g. in gdb.base/default.exp, valgrind detects leaks such as
==17663== 1,438 bytes in 101 blocks are definitely lost in loss record 2,804 of 2,884
==17663==    at 0x4C2BE6D: malloc (vg_replace_malloc.c:309)
==17663==    by 0x418A17: xmalloc (common-utils.c:44)
==17663==    by 0x4E6F19C: history_expand (histexpand.c:1061)
==17663==    by 0x4B4490: handle_line_of_input(buffer*, char const*, int, char const*) (event-top.c:685)
==17663==    by 0x4B4562: command_line_handler(std::unique_ptr<char, gdb::xfree_deleter<char> >&&) (event-top.c:753)
...

Fix the leak by using an unique_xmalloc_ptr for history_value.

gdb/ChangeLog
2019-01-22  Philippe Waroquiers  <philippe.waroquiers@skynet.be>

* event-top.c (handle_line_of_input): use unique_xmalloc_ptr for
history_value.

gdb/ChangeLog
gdb/event-top.c

index 04e8c2d56f39c0246cb288a066c3d3a703990cb8..8e03dbf883fa41341ca2669069348591cf528d76 100644 (file)
@@ -1,3 +1,8 @@
+2019-01-22  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
+
+       * event-top.c (handle_line_of_input): use unique_xmalloc_ptr for
+       history_value.
+
 2019-01-21  Tom Tromey  <tom@tromey.com>
 
        * ui-out.c: Fix includes.
index 3d3d6275d75883f371189b366e11a9dd92a18b27..920b47f7e3cb4774612082e0c790c70d8eacd0aa 100644 (file)
@@ -679,31 +679,29 @@ handle_line_of_input (struct buffer *cmd_line_buffer,
   /* Do history expansion if that is wished.  */
   if (history_expansion_p && from_tty && input_interactive_p (current_ui))
     {
-      char *history_value;
+      char *cmd_expansion;
       int expanded;
 
-      expanded = history_expand (cmd, &history_value);
+      expanded = history_expand (cmd, &cmd_expansion);
+      gdb::unique_xmalloc_ptr<char> history_value (cmd_expansion);
       if (expanded)
        {
          size_t len;
 
          /* Print the changes.  */
-         printf_unfiltered ("%s\n", history_value);
+         printf_unfiltered ("%s\n", history_value.get ());
 
          /* If there was an error, call this function again.  */
          if (expanded < 0)
-           {
-             xfree (history_value);
-             return cmd;
-           }
+           return cmd;
 
          /* history_expand returns an allocated string.  Just replace
             our buffer with it.  */
-         len = strlen (history_value);
+         len = strlen (history_value.get ());
          xfree (buffer_finish (cmd_line_buffer));
-         cmd_line_buffer->buffer = history_value;
+         cmd_line_buffer->buffer = history_value.get ();
          cmd_line_buffer->buffer_size = len + 1;
-         cmd = history_value;
+         cmd = history_value.release ();
        }
     }