]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/tui] Fix assert in tui_source_window_base::refresh_window
authorTom de Vries <tdevries@suse.de>
Tue, 28 Jan 2025 20:00:40 +0000 (21:00 +0100)
committerTom de Vries <tdevries@suse.de>
Tue, 28 Jan 2025 20:00:40 +0000 (21:00 +0100)
Say we use the executable of test-case gdb.tui/tui-missing-src.exp like this:
...
$ gdb.sh -q -tui outputs/gdb.tui/tui-missing-src/tui-missing-src \
    -ex "b f2"\
    -ex run
...
(from a directory not containing a file called main.c to make sure that the
missing source stays missing) and then issue finish:
...
(gdb) finish
Run till exit from #0  f2 (x=4)
    at f2.c:5
0x0000000000400570 in main ()
    at main.c:7
Value returned is $1 = 13
(gdb)
...
and use control-<minus> to decrease the font size (IOW increase the $LINES and
$COLUMNS) on the terminal, we get:
...
gdb/tui/tui-winsource.c:340: internal-error: refresh_window: \
  Assertion `pad_x + view_width <= pad_width || m_pad.get () == nullptr' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
...

The tui_source_window_base class has variable m_pad which keeps track of a
curses pad that is used to display the source code or disassembly efficiently.

The assert in tui_source_window_base::refresh_window triggers while preparing
to display part of the pad.

The problem is that the window is in a state in which the pad is not used,
because m_content.empty () == true.  Instead, it simply shows
"[ No Source Available ]".

Fix this by bailing out of tui_source_window_base::refresh_window before
accessing the m_pad variable, if m_content.empty () == true.

Tested on x86_64-linux.

Approved-By: Tom Tromey <tom@tromey.com>
PR tui/32592
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32592

gdb/testsuite/gdb.tui/tui-missing-src.exp
gdb/tui/tui-winsource.c

index 1929a1e356881034289491a266bcd0f71d12fb37..2310c1d71c8eeece9d48f95d4edbd1373fc9d73a 100644 (file)
@@ -101,3 +101,6 @@ Term::command "finish"
 Term::check_box_contents "check source box is empty after return" \
     0 0 80 15 "No Source Available"
 Term::check_contents "Back in main" "Value returned is .* 13"
+
+Term::resize 30 100
+Term::check_box "source box after resize" 0 0 100 19
index a313e44bb33b240755103f4e5acafc7d3ad5d1ea..a5d0c5945456f690c17533c6f9d2a292958f6d82 100644 (file)
@@ -314,6 +314,9 @@ tui_source_window_base::refresh_window ()
      the screen, potentially creating a flicker.  */
   wnoutrefresh (handle.get ());
 
+  if (m_content.empty ())
+    return;
+
   int pad_width = getmaxx (m_pad.get ());
   int left_margin = this->left_margin ();
   int view_width = this->view_width ();