]> granicus.if.org Git - jq/commitdiff
Prevent redirecting to NUL crash
authorJason Hood <jadoxa@yahoo.com.au>
Tue, 12 Feb 2019 13:18:47 +0000 (23:18 +1000)
committerNico Williams <nico@cryptonector.com>
Sun, 17 Feb 2019 02:40:41 +0000 (20:40 -0600)
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

index 233d130b245f2a20b5912d5ed32bb58bfc1d04da..b8c2857da04060d87427878bcdeccc090b1a3c15 100644 (file)
@@ -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
   }