Pseudo console generates escape sequences on execution of non-cygwin apps. If the terminal does not support escape sequence, output will be garbled. This patch prevents garbled output in dumb terminal by disabling pseudo console. --- winsup/cygwin/spawn.cc | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-)
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 8308bccf3..b6d58e97a 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -647,13 +647,35 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv, ZeroMemory (&si_pcon, sizeof (si_pcon)); STARTUPINFOW *si_tmp = &si; if (!iscygwin () && ptys_primary && is_console_app (runpath)) - if (ptys_primary->setup_pseudoconsole (&si_pcon, - mode != _P_OVERLAY && mode != _P_WAIT)) - { - c_flags |= EXTENDED_STARTUPINFO_PRESENT; - si_tmp = &si_pcon.StartupInfo; - enable_pcon = true; - } + { + bool nopcon = mode != _P_OVERLAY && mode != _P_WAIT; + /* If TERM is "dumb" or not set, disable pseudo console */ + if (envblock) + { + bool term_is_set = false; + for (PWCHAR p = envblock; *p != L'\0'; p += wcslen (p) + 1) + { + if (wcscmp (p, L"TERM=dumb") == 0) + nopcon = true; + if (wcsncmp (p, L"TERM=", 5) == 0) + term_is_set = true; + } + if (!term_is_set) + nopcon = true; + } + else + { + const char *term = getenv ("TERM"); + if (!term || strcmp (term, "dumb") == 0) + nopcon = true; + } + if (ptys_primary->setup_pseudoconsole (&si_pcon, nopcon)) + { + c_flags |= EXTENDED_STARTUPINFO_PRESENT; + si_tmp = &si_pcon.StartupInfo; + enable_pcon = true; + } + } loop: /* When ruid != euid we create the new process under the current original -- 2.28.0