public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [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).