aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHannes Domani <ssbssa@yahoo.de>2023-11-06 18:32:41 +0100
committerHannes Domani <ssbssa@yahoo.de>2023-11-06 18:32:41 +0100
commit4458f245568fbed785cc8c9b83ff6f3887405dd9 (patch)
treebee2e58ffb6a9decd73f72cf90872e0cb1782a4b
parent169fe7ab54b964a6619c6fd05ab55090fa671b10 (diff)
downloadgdb-4458f245568fbed785cc8c9b83ff6f3887405dd9.zip
gdb-4458f245568fbed785cc8c9b83ff6f3887405dd9.tar.gz
gdb-4458f245568fbed785cc8c9b83ff6f3887405dd9.tar.bz2
Fix resizing of TUI python windows
When resizing from a big to small terminal size, and you have a TUI python window that would then be outside of the new size, valgrind shows this error: ==3389== Invalid read of size 1 ==3389== at 0xC3DFEE: wnoutrefresh (lib_refresh.c:167) ==3389== by 0xC3E3C9: wrefresh (lib_refresh.c:63) ==3389== by 0xA9766C: tui_unhighlight_win(tui_win_info*) (tui-wingeneral.c:134) ==3389== by 0x98921C: tui_py_window::rerender() (py-tui.c:183) ==3389== by 0xA8C23C: tui_layout_split::apply(int, int, int, int, bool) (tui-layout.c:1030) ==3389== by 0xA8C2A2: tui_layout_split::apply(int, int, int, int, bool) (tui-layout.c:1033) ==3389== by 0xA8C23C: tui_layout_split::apply(int, int, int, int, bool) (tui-layout.c:1030) ==3389== by 0xA8B1F8: tui_apply_current_layout(bool) (tui-layout.c:81) ==3389== by 0xA95CDB: tui_resize_all() (tui-win.c:525) ==3389== by 0xA95D1E: tui_async_resize_screen(void*) (tui-win.c:562) ==3389== by 0x6B855D: invoke_async_signal_handlers() (async-event.c:234) ==3389== by 0xC0CEF8: gdb_do_one_event(int) (event-loop.cc:199) ==3389== Address 0x115cc214 is 1,332 bytes inside a block of size 2,240 free'd ==3389== at 0x4A0A430: free (vg_replace_malloc.c:446) ==3389== by 0xC3CF7D: _nc_freewin (lib_newwin.c:121) ==3389== by 0xA8B1C6: tui_apply_current_layout(bool) (tui-layout.c:78) ==3389== by 0xA95CDB: tui_resize_all() (tui-win.c:525) ==3389== by 0xA95D1E: tui_async_resize_screen(void*) (tui-win.c:562) ==3389== by 0x6B855D: invoke_async_signal_handlers() (async-event.c:234) ==3389== by 0xC0CEF8: gdb_do_one_event(int) (event-loop.cc:199) ==3389== by 0x8E40E9: captured_command_loop() (main.c:407) ==3389== by 0x8E5E54: gdb_main(captured_main_args*) (main.c:1324) ==3389== by 0x62AC04: main (gdb.c:39) It's because tui_py_window::m_inner_window still has the outside coordinates, and wnoutrefresh then does an out-of-bounds access. Fix this by resetting m_inner_window on every resize, it will anyways be recreated in the next rerender call. Approved-By: Andrew Burgess <aburgess@redhat.com>
-rw-r--r--gdb/python/py-tui.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/gdb/python/py-tui.c b/gdb/python/py-tui.c
index 64f22db..a84e38a 100644
--- a/gdb/python/py-tui.c
+++ b/gdb/python/py-tui.c
@@ -102,6 +102,8 @@ public:
tui_win_info::refresh_window ();
}
+ void resize (int height, int width, int origin_x, int origin_y) override;
+
void click (int mouse_x, int mouse_y, int mouse_button) override;
/* Erase and re-box the window. */
@@ -233,6 +235,14 @@ tui_py_window::do_scroll_vertical (int num_to_scroll)
}
void
+tui_py_window::resize (int height_, int width_, int origin_x_, int origin_y_)
+{
+ m_inner_window.reset (nullptr);
+
+ tui_win_info::resize (height_, width_, origin_x_, origin_y_);
+}
+
+void
tui_py_window::click (int mouse_x, int mouse_y, int mouse_button)
{
gdbpy_enter enter_py;