This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH] PR tui/21599: GDB crashes if TUI terminal window is made too small
- From: Sergio Durigan Junior <sergiodj at redhat dot com>
- To: GDB Patches <gdb-patches at sourceware dot org>
- Cc: Sergio Durigan Junior <sergiodj at redhat dot com>
- Date: Wed, 14 Jun 2017 17:19:12 -0400
- Subject: [PATCH] PR tui/21599: GDB crashes if TUI terminal window is made too small
- Authentication-results: sourceware.org; auth=none
- Authentication-results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com
- Authentication-results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=sergiodj at redhat dot com
- Dkim-filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 776E3624CF
- Dmarc-filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 776E3624CF
This problem happens mostly when using TUI mode inside a tmux pane
which is split horizontally. To reproduce:
1) Enter tmux. I am assuming that the modifier sequence for your tmux is C-b (the default).
2) Split the pane horizontally (C-b ").
3) Start GDB in TUI mode (gdb -tui) on the upper pane.
4) Resize the upper pane, making it as small as possible (C-b <upper-arrow>, repeatedly).
The problem happens because tmux's pane has a screen height that makes
GDB miscalculate the minimum screen height that can be set by the
terminal. The solution I found was to first check if this minimum
height is actually negative, and avoid using it if so. In this case,
TUI can just use the MIN_WIN_HEIGHT define and be done with the
resizing process.
gdb/ChangeLog:
yyyy-mm-dd Sergio Durigan Junior <sergiodj@redhat.com>
PR tui/21599
* tui-win.c (tui_resize_all): New variable 'min_screenheight'.
Use it to avoid resizing the TUI window to an invalid value.
---
gdb/tui/tui-win.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index f49d7d5..ec594bf 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -753,6 +753,7 @@ tui_resize_all (void)
{
int height_diff, width_diff;
int screenheight, screenwidth;
+ int min_screenheight;
rl_get_screen_size (&screenheight, &screenwidth);
width_diff = screenwidth - tui_term_width ();
@@ -795,6 +796,7 @@ tui_resize_all (void)
erase ();
clearok (curscr, TRUE);
refresh ();
+ min_screenheight = screenheight - MIN_CMD_WIN_HEIGHT - 1;
switch (cur_layout)
{
case SRC_COMMAND:
@@ -805,9 +807,16 @@ tui_resize_all (void)
/* Check for invalid heights. */
if (height_diff == 0)
new_height = first_win->generic.height;
+ else if (min_screenheight < 0)
+ {
+ /* In some cases min_screenheight can be negative.
+ E.g., when using tmux and resizing the screen to the
+ minimum allowed. See PR tui/21599. */
+ new_height = MIN_WIN_HEIGHT;
+ }
else if ((first_win->generic.height + split_diff) >=
- (screenheight - MIN_CMD_WIN_HEIGHT - 1))
- new_height = screenheight - MIN_CMD_WIN_HEIGHT - 1;
+ min_screenheight)
+ new_height = min_screenheight;
else if ((first_win->generic.height + split_diff) <= 0)
new_height = MIN_WIN_HEIGHT;
else
--
2.9.3