diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c
index f89a5339e0f3255b0376a78ba150562a5ab6d628..916519be5024cae585599049049ee90ebc5d1f97 100644
--- a/src/backend/postmaster/syslogger.c
+++ b/src/backend/postmaster/syslogger.c
@@ -47,17 +47,6 @@
 #include "utils/ps_status.h"
 #include "utils/timestamp.h"
 
-/*
- * We really want line-buffered mode for logfile output, but Windows does
- * not have it, and interprets _IOLBF as _IOFBF (bozos).  So use _IONBF
- * instead on Windows.
- */
-#ifdef WIN32
-#define LBF_MODE	_IONBF
-#else
-#define LBF_MODE	_IOLBF
-#endif
-
 /*
  * We read() into a temp buffer twice as big as a chunk, so that any fragment
  * left after processing can be moved down to the front and we'll still have
@@ -765,7 +754,7 @@ syslogger_parseArgs(int argc, char *argv[])
 	if (fd != -1)
 	{
 		syslogFile = fdopen(fd, "a");
-		setvbuf(syslogFile, NULL, LBF_MODE, 0);
+		setvbuf(syslogFile, NULL, PG_IOLBF, 0);
 	}
 #else							/* WIN32 */
 	fd = atoi(*argv++);
@@ -775,7 +764,7 @@ syslogger_parseArgs(int argc, char *argv[])
 		if (fd > 0)
 		{
 			syslogFile = fdopen(fd, "a");
-			setvbuf(syslogFile, NULL, LBF_MODE, 0);
+			setvbuf(syslogFile, NULL, PG_IOLBF, 0);
 		}
 	}
 #endif   /* WIN32 */
@@ -1154,7 +1143,7 @@ logfile_open(const char *filename, const char *mode, bool allow_errors)
 
 	if (fh)
 	{
-		setvbuf(fh, NULL, LBF_MODE, 0);
+		setvbuf(fh, NULL, PG_IOLBF, 0);
 
 #ifdef WIN32
 		/* use CRLF line endings on Windows */
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index acaae029806b9a4f10e3845afee7772f8d86ab40..5228f1342224efe830e309ec60633ec2c4b1c57f 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -3529,7 +3529,7 @@ main(int argc, char *argv[])
 	 * unexpected output ordering when, eg, output is redirected to a file.
 	 * POSIX says we must do this before any other usage of these files.
 	 */
-	setvbuf(stdout, NULL, _IOLBF, 0);
+	setvbuf(stdout, NULL, PG_IOLBF, 0);
 	setvbuf(stderr, NULL, _IONBF, 0);
 
 	progname = get_progname(argv[0]);
diff --git a/src/include/port.h b/src/include/port.h
index 3d7f2675545c2d721a8d9f39fbf2e738a0b21119..c9226f3dac15a20383a0e99cd67e9a9030b6ce17 100644
--- a/src/include/port.h
+++ b/src/include/port.h
@@ -338,6 +338,20 @@ extern int	gettimeofday(struct timeval * tp, struct timezone * tzp);
 #define closesocket close
 #endif   /* WIN32 */
 
+/*
+ * On Windows, setvbuf() does not support _IOLBF mode, and interprets that
+ * as _IOFBF.  To add insult to injury, setvbuf(file, NULL, _IOFBF, 0)
+ * crashes outright if "parameter validation" is enabled.  Therefore, in
+ * places where we'd like to select line-buffered mode, we fall back to
+ * unbuffered mode instead on Windows.  Always use PG_IOLBF not _IOLBF
+ * directly in order to implement this behavior.
+ */
+#ifndef WIN32
+#define PG_IOLBF	_IOLBF
+#else
+#define PG_IOLBF	_IONBF
+#endif
+
 /*
  * Default "extern" declarations or macro substitutes for library routines.
  * When necessary, these routines are provided by files in src/port/.