From 1541974564a65b6edbf09447e8cf54355fe10805 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Thu, 30 Sep 2021 18:33:16 +0100 Subject: [PATCH] Windows dputs: use WriteFile to avoid stdio buffering. Trying to debug a problem involving threads just now, it turned out that the version of the diagnostics going to my debug.log was getting data in a different order from the version going to the debug console. Now I open and write to debug_fp by going directly to the Win32 API instead of via a buffering userland stdio, and that seems to have solved the problem. --- windows/utils/dputs.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/windows/utils/dputs.c b/windows/utils/dputs.c index 15b0e4db..f582509a 100644 --- a/windows/utils/dputs.c +++ b/windows/utils/dputs.c @@ -11,7 +11,7 @@ #include "putty.h" #include "utils/utils.h" -static FILE *debug_fp = NULL; +static HANDLE debug_fp = INVALID_HANDLE_VALUE; static HANDLE debug_hdl = INVALID_HANDLE_VALUE; static int debug_got_console = 0; @@ -25,13 +25,15 @@ void dputs(const char *buf) debug_hdl = GetStdHandle(STD_OUTPUT_HANDLE); } } - if (!debug_fp) { - debug_fp = fopen("debug.log", "w"); + if (debug_fp == INVALID_HANDLE_VALUE) { + debug_fp = CreateFile("debug.log", GENERIC_WRITE, FILE_SHARE_READ, + NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); } + if (debug_fp != INVALID_HANDLE_VALUE) { + WriteFile(debug_fp, buf, strlen(buf), &dw, NULL); + } if (debug_hdl != INVALID_HANDLE_VALUE) { WriteFile(debug_hdl, buf, strlen(buf), &dw, NULL); } - fputs(buf, debug_fp); - fflush(debug_fp); }