From 87594f81d6f63556f2644fff4ed493aaac97974c Mon Sep 17 00:00:00 2001 From: Jason Hood Date: Tue, 12 Feb 2019 23:18:47 +1000 Subject: [PATCH] Prevent redirecting to NUL crash Windows regards the `NUL` device as tty, which causes `WriteFile` to fail (the bytes written pointer cannot be `NULL` in this case). Tweak the color test to ensure tty is accurate. --- src/main.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/main.c b/src/main.c index 233d130b..b8c2857d 100644 --- a/src/main.c +++ b/src/main.c @@ -533,21 +533,19 @@ int main(int argc, char* argv[]) { #ifdef USE_ISATTY if (isatty(STDOUT_FILENO)) { - dumpopts |= JV_PRINT_ISATTY; #ifndef WIN32 - /* Disable color by default on Windows builds as Windows - terminals tend not to display it correctly */ - dumpopts |= JV_PRINT_COLOR; + dumpopts |= JV_PRINT_ISATTY | JV_PRINT_COLOR; #else - // Unless ANSICON is installed, or it's Windows 10 - if (getenv("ANSICON") != NULL) - dumpopts |= JV_PRINT_COLOR; - else { - DWORD mode; - HANDLE con = GetStdHandle(STD_OUTPUT_HANDLE); - if (GetConsoleMode(con, &mode) && - SetConsoleMode(con, mode | 4/*ENABLE_VIRTUAL_TERMINAL_PROCESSING*/)) - dumpopts |= JV_PRINT_COLOR; + /* Verify we actually have the console, as the NUL device is also regarded as + tty. Windows can handle color if ANSICON (or ConEmu) is installed, or + Windows 10 supports the virtual terminal */ + DWORD mode; + HANDLE con = GetStdHandle(STD_OUTPUT_HANDLE); + if (GetConsoleMode(con, &mode)) { + dumpopts |= JV_PRINT_ISATTY; + if (getenv("ANSICON") != NULL || + SetConsoleMode(con, mode | 4/*ENABLE_VIRTUAL_TERMINAL_PROCESSING*/)) + dumpopts |= JV_PRINT_COLOR; } #endif }