git: dcb2c375221a - stable/15 - ping: Flush stdout after printing initial status

From: Dag-Erling Smørgrav <des_at_FreeBSD.org>
Date: Tue, 07 Jul 2026 20:57:49 UTC
The branch stable/15 has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=dcb2c375221a8d15543c8caa93634c403939e8db

commit dcb2c375221a8d15543c8caa93634c403939e8db
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2026-06-23 15:20:22 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2026-07-07 07:07:01 +0000

    ping: Flush stdout after printing initial status
    
    MFC after:      1 week
    Reviewed by:    markj
    Differential Revision:  https://reviews.freebsd.org/D57765
    
    (cherry picked from commit 141bb8579882f9d1f7e95351573e30f10689f4bf)
    
    ping: Don't mix stdio and direct writes
    
    POSIX does not allow mixing direct writes to STDOUT_FILENO with stdio
    operations on stdout like we do here.  More importantly, it causes
    tests to fail randomly (or not-so-randomly after I added an fflush in
    a previous commit).
    
    MFC after:      1 week
    Reviewed by:    markj
    Differential Revision:  https://reviews.freebsd.org/D57884
    
    (cherry picked from commit 8bda488114f330d758e6741ff44882bb12b76c0d)
---
 sbin/ping/ping.c  | 27 +++++++++++++++++----------
 sbin/ping/ping6.c | 28 ++++++++++++++++++----------
 2 files changed, 35 insertions(+), 20 deletions(-)

diff --git a/sbin/ping/ping.c b/sbin/ping/ping.c
index d10e3c85c9bd..3fa21760447f 100644
--- a/sbin/ping/ping.c
+++ b/sbin/ping/ping.c
@@ -829,7 +829,6 @@ ping(int argc, char *const *argv)
 			    sweepmin, sweepmax);
 		else
 			(void)printf(": %d data bytes\n", datalen);
-
 	} else {
 		if (sweepmax)
 			(void)printf("PING %s: (%d ... %d) data bytes\n",
@@ -837,6 +836,7 @@ ping(int argc, char *const *argv)
 		else
 			(void)printf("PING %s: %d data bytes\n", hostname, datalen);
 	}
+	(void)fflush(stdout);
 
 	/*
 	 * Use sigaction() instead of signal() to get unambiguous semantics,
@@ -982,8 +982,10 @@ ping(int argc, char *const *argv)
 			(void)clock_gettime(CLOCK_MONOTONIC, &last);
 			if (ntransmitted - nreceived - 1 > nmissedmax) {
 				nmissedmax = ntransmitted - nreceived - 1;
-				if (options & F_MISSED)
-					(void)write(STDOUT_FILENO, &BBELL, 1);
+				if (options & F_MISSED) {
+					(void)putc(BBELL, stdout);
+					(void)fflush(stdout);
+				}
 			}
 		}
 	}
@@ -1077,8 +1079,10 @@ pinger(void)
 	}
 	ntransmitted++;
 	sntransmitted++;
-	if (!(options & F_QUIET) && options & F_DOT)
-		(void)write(STDOUT_FILENO, &DOT[DOTidx++ % DOTlen], 1);
+	if (!(options & F_QUIET) && options & F_DOT) {
+		(void)putc(DOT[DOTidx++ % DOTlen], stdout);
+		(void)fflush(stdout);
+	}
 }
 
 /*
@@ -1200,9 +1204,10 @@ pr_pack(char *buf, ssize_t cc, struct sockaddr_in *from, struct timespec *tv)
 			return;
 		}
 
-		if (options & F_DOT)
-			(void)write(STDOUT_FILENO, &BSPACE, 1);
-		else {
+		if (options & F_DOT) {
+			(void)putc(BSPACE, stdout);
+			(void)fflush(stdout);
+		} else {
 			(void)printf("%zd bytes from %s: icmp_seq=%u", cc,
 			    pr_addr(from->sin_addr), seq);
 			(void)printf(" ttl=%d", ip.ip_ttl);
@@ -1210,8 +1215,10 @@ pr_pack(char *buf, ssize_t cc, struct sockaddr_in *from, struct timespec *tv)
 				(void)printf(" time=%.3f ms", triptime);
 			if (dupflag)
 				(void)printf(" (DUP!)");
-			if (options & F_AUDIBLE)
-				(void)write(STDOUT_FILENO, &BBELL, 1);
+			if (options & F_AUDIBLE) {
+				(void)putc(BBELL, stdout);
+				(void)fflush(stdout);
+			}
 			if (options & F_MASK) {
 				/* Just prentend this cast isn't ugly */
 				(void)printf(" mask=%s",
diff --git a/sbin/ping/ping6.c b/sbin/ping/ping6.c
index f81de062e59a..1cebcee8cc36 100644
--- a/sbin/ping/ping6.c
+++ b/sbin/ping/ping6.c
@@ -1111,6 +1111,7 @@ ping6(int argc, char *argv[])
 	    (unsigned long)(pingerlen() - 8));
 	printf("%s --> ", pr_addr((struct sockaddr *)&src, sizeof(src)));
 	printf("%s\n", pr_addr((struct sockaddr *)&dst, sizeof(dst)));
+	fflush(stdout);
 
 	if (preload == 0)
 		pinger();
@@ -1237,8 +1238,10 @@ ping6(int argc, char *argv[])
 			clock_gettime(CLOCK_MONOTONIC, &last);
 			if (ntransmitted - nreceived - 1 > nmissedmax) {
 				nmissedmax = ntransmitted - nreceived - 1;
-				if (options & F_MISSED)
-					(void)write(STDOUT_FILENO, &BBELL, 1);
+				if (options & F_MISSED) {
+					(void)putc(BBELL, stdout);
+					(void)fflush(stdout);
+				}
 			}
 		}
 	}
@@ -1414,8 +1417,10 @@ pinger(void)
 		(void)printf("ping: wrote %s %d chars, ret=%d\n",
 		    hostname, cc, i);
 	}
-	if (!(options & F_QUIET) && options & F_DOT)
-		(void)write(STDOUT_FILENO, &DOT[DOTidx++ % DOTlen], 1);
+	if (!(options & F_QUIET) && options & F_DOT) {
+		(void)putc(DOT[DOTidx++ % DOTlen], stdout);
+		(void)fflush(stdout);
+	}
 
 	return(0);
 }
@@ -1612,11 +1617,14 @@ pr_pack(u_char *buf, int cc, struct msghdr *mhdr)
 			return;
 		}
 
-		if (options & F_DOT)
-			(void)write(STDOUT_FILENO, &BSPACE, 1);
-		else {
-			if (options & F_AUDIBLE)
-				(void)write(STDOUT_FILENO, &BBELL, 1);
+		if (options & F_DOT) {
+			(void)putc(BSPACE, stdout);
+			(void)fflush(stdout);
+		} else {
+			if (options & F_AUDIBLE) {
+				(void)putc(BBELL, stdout);
+				(void)fflush(stdout);
+			}
 			(void)printf("%d bytes from %s, icmp_seq=%u", cc,
 			    pr_addr(from, fromlen), seq);
 			(void)printf(" hlim=%d", hoplim);
@@ -1805,7 +1813,7 @@ pr_pack(u_char *buf, int cc, struct msghdr *mhdr)
 	}
 
 	if (!(options & F_DOT)) {
-		(void)putchar('\n');
+		(void)putc('\n', stdout);
 		if (options & F_VERBOSE)
 			pr_exthdrs(mhdr);
 		(void)fflush(stdout);