Fix some valgrind errors in the TUI
authorTom Tromey <tom@tromey.com>
Mon, 28 Jan 2019 20:21:35 +0000 (13:21 -0700)
committerTom Tromey <tom@tromey.com>
Sun, 17 Feb 2019 17:39:45 +0000 (10:39 -0700)
The styling series introduced some new errors in the TUI -- the series
changed how source lines are allocated, without updating
tui_set_source_content_nil.

There are several failures but a typical one looks like:

==6274== Use of uninitialised value of size 8
==6274==    at 0x4E4A095: wclrtoeol (in /usr/lib64/libncursesw.so.6.1)
==6274==    by 0x4E47617: waddch (in /usr/lib64/libncursesw.so.6.1)
==6274==    by 0x8325CB: tui_puts_internal(_win_st*, char const*, int*) (tui-io.c:393)
==6274==    by 0x82E89D: tui_file::puts(char const*) (tui-file.c:39)
==6274==    by 0x84BF5F: vfprintf_unfiltered(ui_file*, char const*, __va_list_tag*) (utils.c:2026)

This patch rewrites tui_set_source_content_nil, fixing the bug.

This was also reported as PR tui/24197.

Verified by running valgrind before and after on x86-64 Fedora 29.

gdb/ChangeLog
2019-02-17  Tom Tromey  <tom@tromey.com>

PR tui/24197:
* tui/tui-source.c (tui_set_source_content_nil): Rewrite.

gdb/ChangeLog
gdb/tui/tui-source.c

index eb3bc0b7670b40b1748dab9a7ffab644f8c59907..b9af73f371c69d437df1f18edb9ef789ce702e0a 100644 (file)
@@ -1,3 +1,8 @@
+2019-02-17  Tom Tromey  <tom@tromey.com>
+
+       PR tui/24197:
+       * tui/tui-source.c (tui_set_source_content_nil): Rewrite.
+
 2019-02-17  Tom Tromey  <tom@tromey.com>
 
        * ada-lang.c (user_select_syms): Use filtered printing.
index a7e801eba2606cba761f0dd6b9285debf0d2aa4f..7cc3c00069c661972008038591d2995851b1e241 100644 (file)
@@ -253,33 +253,22 @@ tui_set_source_content_nil (struct tui_win_info *win_info,
 
       if (curr_line == (n_lines / 2 + 1))
        {
-         int i;
          int xpos;
          int warning_length = strlen (warning_string);
          char *src_line;
 
-         src_line = element->which_element.source.line;
-
          if (warning_length >= ((line_width - 1) / 2))
            xpos = 1;
          else
            xpos = (line_width - 1) / 2 - warning_length;
 
-         for (i = 0; i < xpos; i++)
-           src_line[i] = ' ';
-
-         sprintf (src_line + i, "%s", warning_string);
-
-         for (i = xpos + warning_length; i < line_width; i++)
-           src_line[i] = ' ';
-
-         src_line[i] = '\n';
-
-       }                       /* end if */
+         src_line = xstrprintf ("%s%s", n_spaces (xpos), warning_string);
+         xfree (element->which_element.source.line);
+         element->which_element.source.line = src_line;
+       }
 
       curr_line++;
-
-    }                          /* end while */
+    }
 }