]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit
[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)
commit1c525b0e037b895f6d21deaf32dd922dfdd9c822
tree4039ff9478a50c1b6b50c84b638067420ebb72da
parent852cbc7ffadf9daf173e13ea56caff49d52733af
[gdb/tui] Fix assert in tui_source_window_base::refresh_window

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