* [PATCH] Fix resizing of TUI python windows [not found] <20231103164001.3464-1-ssbssa.ref@yahoo.de> @ 2023-11-03 16:40 ` Hannes Domani 2023-11-06 16:56 ` Andrew Burgess 0 siblings, 1 reply; 3+ messages in thread From: Hannes Domani @ 2023-11-03 16:40 UTC (permalink / raw) To: gdb-patches 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. --- gdb/python/py-tui.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/gdb/python/py-tui.c b/gdb/python/py-tui.c index 64f22dbb462..a84e38a0563 100644 --- a/gdb/python/py-tui.c +++ b/gdb/python/py-tui.c @@ -102,6 +102,8 @@ class tui_py_window : public tui_win_info 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. */ @@ -232,6 +234,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) { -- 2.35.1 ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] Fix resizing of TUI python windows 2023-11-03 16:40 ` [PATCH] Fix resizing of TUI python windows Hannes Domani @ 2023-11-06 16:56 ` Andrew Burgess 2023-11-06 17:38 ` Hannes Domani 0 siblings, 1 reply; 3+ messages in thread From: Andrew Burgess @ 2023-11-06 16:56 UTC (permalink / raw) To: Hannes Domani, gdb-patches Hannes Domani <ssbssa@yahoo.de> writes: > 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. Yeah, I wonder why we do it that way. It feels like calling wclear() might be more efficient. Still given where we are I think your fix makes sense. Approved-By: Andrew Burgess <aburgess@redhat.com> Thanks, Andrew > --- > gdb/python/py-tui.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/gdb/python/py-tui.c b/gdb/python/py-tui.c > index 64f22dbb462..a84e38a0563 100644 > --- a/gdb/python/py-tui.c > +++ b/gdb/python/py-tui.c > @@ -102,6 +102,8 @@ class tui_py_window : public tui_win_info > 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. */ > @@ -232,6 +234,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) > { > -- > 2.35.1 ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] Fix resizing of TUI python windows 2023-11-06 16:56 ` Andrew Burgess @ 2023-11-06 17:38 ` Hannes Domani 0 siblings, 0 replies; 3+ messages in thread From: Hannes Domani @ 2023-11-06 17:38 UTC (permalink / raw) To: gdb-patches, Andrew Burgess Am Montag, 6. November 2023, 17:56:23 MEZ hat Andrew Burgess <aburgess@redhat.com> Folgendes geschrieben: > Hannes Domani <ssbssa@yahoo.de> writes: > > > 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. > > Yeah, I wonder why we do it that way. It feels like calling wclear() > might be more efficient. > > Still given where we are I think your fix makes sense. > > Approved-By: Andrew Burgess <aburgess@redhat.com> > > Thanks, > Andrew Pushed, thanks. Regards Hannes ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2023-11-06 17:38 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- [not found] <20231103164001.3464-1-ssbssa.ref@yahoo.de> 2023-11-03 16:40 ` [PATCH] Fix resizing of TUI python windows Hannes Domani 2023-11-06 16:56 ` Andrew Burgess 2023-11-06 17:38 ` Hannes Domani
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).