diff options
author | Hannes Domani <ssbssa@yahoo.de> | 2023-11-06 18:32:41 +0100 |
---|---|---|
committer | Hannes Domani <ssbssa@yahoo.de> | 2023-11-06 18:32:41 +0100 |
commit | 4458f245568fbed785cc8c9b83ff6f3887405dd9 (patch) | |
tree | bee2e58ffb6a9decd73f72cf90872e0cb1782a4b | |
parent | 169fe7ab54b964a6619c6fd05ab55090fa671b10 (diff) | |
download | gdb-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.c | 10 |
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; |