Cygwin: console: Revise the code checking if the console is legacy.

- Accessing shared_console_info before initializing causes access
  violation in checking if the console is legacy mode. This patch
  fixes this issue. This solves the problem reported in:
  https://www.cygwin.com/ml/cygwin-patches/2019-q4/msg00099.html
This commit is contained in:
Takashi Yano 2019-11-13 03:04:59 +09:00 committed by Corinna Vinschen
parent 7ef4290a98
commit 8f8522c82a

View File

@ -56,6 +56,7 @@ details. */
#define srBottom ((con.scroll_region.Bottom < 0) ? \ #define srBottom ((con.scroll_region.Bottom < 0) ? \
con.b.srWindow.Bottom : \ con.b.srWindow.Bottom : \
con.b.srWindow.Top + con.scroll_region.Bottom) con.b.srWindow.Top + con.scroll_region.Bottom)
#define con_is_legacy (shared_console_info && con.is_legacy)
const unsigned fhandler_console::MAX_WRITE_CHARS = 16384; const unsigned fhandler_console::MAX_WRITE_CHARS = 16384;
@ -309,7 +310,7 @@ fhandler_console::set_cursor_maybe ()
{ {
con.fillin (get_output_handle ()); con.fillin (get_output_handle ());
/* Nothing to do for xterm compatible mode. */ /* Nothing to do for xterm compatible mode. */
if (wincap.has_con_24bit_colors () && !con.is_legacy) if (wincap.has_con_24bit_colors () && !con_is_legacy)
return; return;
if (con.dwLastCursorPosition.X != con.b.dwCursorPosition.X || if (con.dwLastCursorPosition.X != con.b.dwCursorPosition.X ||
con.dwLastCursorPosition.Y != con.b.dwCursorPosition.Y) con.dwLastCursorPosition.Y != con.b.dwCursorPosition.Y)
@ -349,7 +350,7 @@ fhandler_console::send_winch_maybe ()
{ {
con.scroll_region.Top = 0; con.scroll_region.Top = 0;
con.scroll_region.Bottom = -1; con.scroll_region.Bottom = -1;
if (wincap.has_con_24bit_colors () && !con.is_legacy) if (wincap.has_con_24bit_colors () && !con_is_legacy)
fix_tab_position (get_output_handle (), con.dwWinSize.X); fix_tab_position (get_output_handle (), con.dwWinSize.X);
get_ttyp ()->kill_pgrp (SIGWINCH); get_ttyp ()->kill_pgrp (SIGWINCH);
return true; return true;
@ -483,7 +484,7 @@ sig_exit:
fhandler_console::input_states fhandler_console::input_states
fhandler_console::process_input_message (void) fhandler_console::process_input_message (void)
{ {
if (wincap.has_con_24bit_colors () && !con.is_legacy) if (wincap.has_con_24bit_colors () && !con_is_legacy)
{ {
DWORD dwMode; DWORD dwMode;
/* Enable xterm compatible mode in input */ /* Enable xterm compatible mode in input */
@ -589,7 +590,7 @@ fhandler_console::process_input_message (void)
} }
/* Allow Ctrl-Space to emit ^@ */ /* Allow Ctrl-Space to emit ^@ */
else if (input_rec[i].Event.KeyEvent.wVirtualKeyCode else if (input_rec[i].Event.KeyEvent.wVirtualKeyCode
== ((wincap.has_con_24bit_colors () && !con.is_legacy) ? == ((wincap.has_con_24bit_colors () && !con_is_legacy) ?
'2' : VK_SPACE) '2' : VK_SPACE)
&& (ctrl_key_state & CTRL_PRESSED) && (ctrl_key_state & CTRL_PRESSED)
&& !(ctrl_key_state & ALT_PRESSED)) && !(ctrl_key_state & ALT_PRESSED))
@ -1029,7 +1030,7 @@ fhandler_console::open (int flags, mode_t)
else else
con.is_legacy = false; con.is_legacy = false;
/* Enable xterm compatible mode in input */ /* Enable xterm compatible mode in input */
if (!con.is_legacy) if (!con_is_legacy)
{ {
GetConsoleMode (get_handle (), &dwMode); GetConsoleMode (get_handle (), &dwMode);
dwMode |= ENABLE_VIRTUAL_TERMINAL_INPUT; dwMode |= ENABLE_VIRTUAL_TERMINAL_INPUT;
@ -1037,14 +1038,14 @@ fhandler_console::open (int flags, mode_t)
con.is_legacy = true; con.is_legacy = true;
} }
extern int sawTERM; extern int sawTERM;
if (con.is_legacy && !sawTERM) if (con_is_legacy && !sawTERM)
setenv ("TERM", "cygwin", 1); setenv ("TERM", "cygwin", 1);
} }
DWORD cflags; DWORD cflags;
if (GetConsoleMode (get_handle (), &cflags)) if (GetConsoleMode (get_handle (), &cflags))
SetConsoleMode (get_handle (), ENABLE_WINDOW_INPUT SetConsoleMode (get_handle (), ENABLE_WINDOW_INPUT
| ((wincap.has_con_24bit_colors () && !con.is_legacy) ? | ((wincap.has_con_24bit_colors () && !con_is_legacy) ?
0 : ENABLE_MOUSE_INPUT) 0 : ENABLE_MOUSE_INPUT)
| cflags); | cflags);
@ -1074,7 +1075,7 @@ fhandler_console::close ()
output_mutex = NULL; output_mutex = NULL;
if (shared_console_info && getpid () == con.owner && if (shared_console_info && getpid () == con.owner &&
wincap.has_con_24bit_colors () && !con.is_legacy) wincap.has_con_24bit_colors () && !con_is_legacy)
{ {
DWORD dwMode; DWORD dwMode;
/* Disable xterm compatible mode in input */ /* Disable xterm compatible mode in input */
@ -1221,7 +1222,7 @@ fhandler_console::output_tcsetattr (int, struct termios const *t)
acquire_output_mutex (INFINITE); acquire_output_mutex (INFINITE);
DWORD flags = ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT; DWORD flags = ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT;
/* If system has 24 bit color capability, use xterm compatible mode. */ /* If system has 24 bit color capability, use xterm compatible mode. */
if (wincap.has_con_24bit_colors () && !con.is_legacy) if (wincap.has_con_24bit_colors () && !con_is_legacy)
{ {
flags |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; flags |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
if (!(t->c_oflag & OPOST) || !(t->c_oflag & ONLCR)) if (!(t->c_oflag & OPOST) || !(t->c_oflag & ONLCR))
@ -1286,10 +1287,10 @@ fhandler_console::input_tcsetattr (int, struct termios const *t)
} }
flags |= ENABLE_WINDOW_INPUT | flags |= ENABLE_WINDOW_INPUT |
((wincap.has_con_24bit_colors () && !con.is_legacy) ? ((wincap.has_con_24bit_colors () && !con_is_legacy) ?
0 : ENABLE_MOUSE_INPUT); 0 : ENABLE_MOUSE_INPUT);
/* if system has 24 bit color capability, use xterm compatible mode. */ /* if system has 24 bit color capability, use xterm compatible mode. */
if (wincap.has_con_24bit_colors () && !con.is_legacy) if (wincap.has_con_24bit_colors () && !con_is_legacy)
flags |= ENABLE_VIRTUAL_TERMINAL_INPUT; flags |= ENABLE_VIRTUAL_TERMINAL_INPUT;
int res; int res;
@ -1663,7 +1664,7 @@ bool fhandler_console::write_console (PWCHAR buf, DWORD len, DWORD& done)
{ {
bool need_fix_tab_position = false; bool need_fix_tab_position = false;
/* Check if screen will be alternated. */ /* Check if screen will be alternated. */
if (wincap.has_con_24bit_colors () && !con.is_legacy if (wincap.has_con_24bit_colors () && !con_is_legacy
&& memmem (buf, len*sizeof (WCHAR), L"\033[?1049", 7*sizeof (WCHAR))) && memmem (buf, len*sizeof (WCHAR), L"\033[?1049", 7*sizeof (WCHAR)))
need_fix_tab_position = true; need_fix_tab_position = true;
@ -2511,7 +2512,7 @@ fhandler_console::write_normal (const unsigned char *src,
memset (&ps, 0, sizeof ps); memset (&ps, 0, sizeof ps);
while (found < end while (found < end
&& found - src < CONVERT_LIMIT && found - src < CONVERT_LIMIT
&& ((wincap.has_con_24bit_colors () && !con.is_legacy) && ((wincap.has_con_24bit_colors () && !con_is_legacy)
|| base_chars[*found] == NOR) ) || base_chars[*found] == NOR) )
{ {
switch (ret = f_mbtowc (_REENT, NULL, (const char *) found, switch (ret = f_mbtowc (_REENT, NULL, (const char *) found,
@ -2972,7 +2973,7 @@ fhandler_console::fixup_after_fork_exec (bool execing)
{ {
set_unit (); set_unit ();
setup_io_mutex (); setup_io_mutex ();
if (wincap.has_con_24bit_colors () && !con.is_legacy) if (wincap.has_con_24bit_colors () && !con_is_legacy)
{ {
DWORD dwMode; DWORD dwMode;
/* Disable xterm compatible mode in input */ /* Disable xterm compatible mode in input */