gdb/gdb-tui-enable-work-around-libncurses-segfault.patch

48 lines
1.4 KiB
Diff

diff --git a/gdb/tui/tui.c b/gdb/tui/tui.c
index 828e42bccf7..551a72e3992 100644
--- a/gdb/tui/tui.c
+++ b/gdb/tui/tui.c
@@ -57,7 +57,7 @@
/* Tells whether the TUI is active or not. */
bool tui_active = false;
-static bool tui_finish_init = true;
+static int tui_init = -1;
enum tui_key_mode tui_current_key_mode = TUI_COMMAND_MODE;
@@ -363,7 +363,13 @@ tui_enable (void)
/* To avoid to initialize curses when gdb starts, there is a deferred
curses initialization. This initialization is made only once
and the first time the curses mode is entered. */
- if (tui_finish_init)
+ if (tui_init == 0)
+ {
+ /* Initalization failed before, just throw a generic error, don't try
+ again. Workaround for segfault in libncurses5 bsc#1179210. */
+ error (_("Cannot enable the TUI"));
+ }
+ else if (tui_init == -1)
{
WINDOW *w;
SCREEN *s;
@@ -383,6 +389,8 @@ tui_enable (void)
if (!gdb_stderr->isatty ())
error (_("Cannot enable the TUI when output is not a terminal"));
+ tui_init = 0;
+
s = newterm (NULL, stdout, stdin);
#ifdef __MINGW32__
/* The MinGW port of ncurses requires $TERM to be unset in order
@@ -435,7 +443,8 @@ tui_enable (void)
tui_set_win_focus_to (TUI_SRC_WIN);
keypad (TUI_CMD_WIN->handle.get (), TRUE);
wrefresh (TUI_CMD_WIN->handle.get ());
- tui_finish_init = false;
+
+ tui_init = 1;
}
else
{