Remaining linebuffer size (i.e., how many characters snprintf() is
allowed to still add) should be `SNBUFFERSIZE-strlen(linebuffer)`,
rather than `SNBUFFERSIZE-strlen(b)`, where b is the pointer to the
*END* of linebuffer (and thus strlen(b) will always be 0, always
telling snprintf() that it can still print SNBUFFERSIZE characters,
even when linebuffer is already partially or totally filled.
---

Re-sending (after subscribing to iperf-users) b/c I need a mailing list
link to reference in Bugzilla :)

 src/ReportOutputs.c | 50 ++++++++++++++++++++++-----------------------
 1 file changed, 25 insertions(+), 25 deletions(-)

diff --git a/src/ReportOutputs.c b/src/ReportOutputs.c
index 463aa913..6a03cb22 100644
--- a/src/ReportOutputs.c
+++ b/src/ReportOutputs.c
@@ -2638,7 +2638,7 @@ void reporter_print_connection_report (struct 
ConnectionInfo *report) {
     int n;
 #if HAVE_DECL_TCP_WINDOW_CLAMP
     if (!isUDP(report->common) && isRxClamp(report->common)) {
-       n = snprintf(b, (SNBUFFERSIZE-strlen(b)), " (%s%d)", "clamp=", 
report->common->ClampSize);
+       n = snprintf(b, (SNBUFFERSIZE-strlen(linebuffer)), " (%s%d)", "clamp=", 
report->common->ClampSize);
        FAIL_exit((n < 0), "fail append clamp");
        FAIL_exit((strlen(linebuffer) >= SNBUFFERSIZE), "buffer overflow 
clamp");
        b += n;
@@ -2646,57 +2646,57 @@ void reporter_print_connection_report (struct 
ConnectionInfo *report) {
 #endif
 #if HAVE_DECL_TCP_NOTSENT_LOWAT
     if (!isUDP(report->common) && (report->common->socket > 0) && 
isWritePrefetch(report->common))  {
-       n = snprintf(b, SNBUFFERSIZE-strlen(b), " (%s%d)", "prefetch=", 
report->common->WritePrefetch);
+       n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (%s%d)", 
"prefetch=", report->common->WritePrefetch);
        FAIL_exit((n < 0), "fail append prefetch");
        FAIL_exit((strlen(linebuffer) >= SNBUFFERSIZE), "buffer overflow 
prefetch");
        b += n;
     }
 #endif
     if (isIsochronous(report->common)) {
-       n = snprintf(b, SNBUFFERSIZE-strlen(b), " (isoch)");
+       n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (isoch)");
        FAIL_exit((n < 0), "fail append isoch");
        FAIL_exit((strlen(linebuffer) >= SNBUFFERSIZE), "buffer overflow 
isoch");
        b += n;
     }
     if (isPeriodicBurst(report->common) && (report->common->ThreadMode != 
kMode_Client) && !isServerReverse(report->common)) {
 #if HAVE_FASTSAMPLING
-       n = snprintf(b, SNBUFFERSIZE-strlen(b), " (burst-period=%0.4fs)", (1.0 
/ report->common->FPS));
+       n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " 
(burst-period=%0.4fs)", (1.0 / report->common->FPS));
 #else
-        n = snprintf(b, SNBUFFERSIZE-strlen(b), " (burst-period=%0.2fs)", (1.0 
/ report->common->FPS));
+        n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " 
(burst-period=%0.2fs)", (1.0 / report->common->FPS));
 #endif
        FAIL_exit((n < 0), "fail append burst");
        FAIL_exit((strlen(linebuffer) >= SNBUFFERSIZE), "buffer overflow 
burst");
        b += n;
     }
     if (isFullDuplex(report->common)) {
-       n = snprintf(b, SNBUFFERSIZE-strlen(b), " (full-duplex)");
+       n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (full-duplex)");
        FAIL_exit((n < 0), "fail append duplex");
        FAIL_exit((strlen(linebuffer) >= SNBUFFERSIZE), "buffer overflow 
duplex");
        b += n;
     } else if (isServerReverse(report->common) || isReverse(report->common)) {
-       n = snprintf(b, SNBUFFERSIZE-strlen(b), " (reverse)");
+       n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (reverse)");
        FAIL_exit((n < 0), "fail append reverse");
        FAIL_exit((strlen(linebuffer) >= SNBUFFERSIZE), "buffer overflow 
reverse");
        b += n;
        if (isFQPacing(report->common)) {
-           n = snprintf(b, SNBUFFERSIZE-strlen(b), " (fq)");
+           n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (fq)");
            FAIL_exit((n < 0), "fail append fq");
            FAIL_exit((strlen(linebuffer) >= SNBUFFERSIZE), "buffer overflow 
fq");
            b += n;
        }
     }
     if (isTxStartTime(report->common)) {
-       n = snprintf(b, SNBUFFERSIZE-strlen(b), " (epoch-start)");
+       n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (epoch-start)");
        FAIL_exit((n < 0), "fail append epoch");
        FAIL_exit((strlen(linebuffer) >= SNBUFFERSIZE), "buffer overflow 
epoch");
        b += n;
     }
     if (isBounceBack(report->common)) {
        if (isTcpQuickAck(report->common)) {
-           n = snprintf(b, SNBUFFERSIZE-strlen(b), " (bb w/quickack 
req/reply/hold=%d/%d/%d)", report->common->bbsize, \
+           n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (bb w/quickack 
req/reply/hold=%d/%d/%d)", report->common->bbsize, \
                     report->common->bbreplysize, report->common->bbhold);
        } else {
-           n = snprintf(b, SNBUFFERSIZE-strlen(b), " (bb 
req/reply/hold=%d/%d/%d)", report->common->bbsize, \
+           n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (bb 
req/reply/hold=%d/%d/%d)", report->common->bbsize, \
                     report->common->bbreplysize, report->common->bbhold);
        }
        FAIL_exit((n < 0), "fail append bb");
@@ -2704,19 +2704,19 @@ void reporter_print_connection_report (struct 
ConnectionInfo *report) {
        b += n;
     }
     if (isL2LengthCheck(report->common)) {
-       n = snprintf(b, SNBUFFERSIZE-strlen(b), " (l2mode)");
+       n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (l2mode)");
        FAIL_exit((n < 0), "fail append l2");
        FAIL_exit((strlen(linebuffer) >= SNBUFFERSIZE), "buffer overflow l2");
        b += n;
     }
     if (isUDP(report->common) && isNoUDPfin(report->common)) {
-       n = snprintf(b, SNBUFFERSIZE-strlen(b), " (no-udp-fin)");
+       n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (no-udp-fin)");
        FAIL_exit((n < 0), "fail append ufin");
        FAIL_exit((strlen(linebuffer) >= SNBUFFERSIZE), "buffer overflow ufin");
        b += n;
     }
     if (isTripTime(report->common)) {
-       n = snprintf(b, SNBUFFERSIZE-strlen(b), " (trip-times)");
+       n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (trip-times)");
        FAIL_exit((n < 0), "fail append tt");
        FAIL_exit((strlen(linebuffer) >= SNBUFFERSIZE), "buffer overflow tt");
        b += n;
@@ -2731,7 +2731,7 @@ void reporter_print_connection_report (struct 
ConnectionInfo *report) {
                cca[len - 1] = '\0';
            }
            if (rc != SOCKET_ERROR) {
-               n = snprintf(b, SNBUFFERSIZE-strlen(b), " (%s)", cca);
+               n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (%s)", cca);
                FAIL_exit((n < 0), "fail append cca");
                FAIL_exit((strlen(linebuffer) >= SNBUFFERSIZE), "buffer 
overflow cca");
                b += n;
@@ -2742,12 +2742,12 @@ void reporter_print_connection_report (struct 
ConnectionInfo *report) {
     if (isOverrideTOS(report->common)) {
        n  = 0;
        if (isFullDuplex(report->common)) {
-           n = snprintf(b, SNBUFFERSIZE-strlen(b), " (tos 
rx/tx=0x%x,dscp=%d,ecn=%d, /0x%x,dscp=%d,ecn=%d)", report->common->TOS, \
+           n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (tos 
rx/tx=0x%x,dscp=%d,ecn=%d, /0x%x,dscp=%d,ecn=%d)", report->common->TOS, \
                     DSCP_VALUE(report->common->TOS), 
ECN_VALUE(report->common->TOS), \
                     report->common->RTOS, \
                     DSCP_VALUE(report->common->RTOS), 
ECN_VALUE(report->common->RTOS));
        } else if (isReverse(report->common)) {
-           n = snprintf(b, SNBUFFERSIZE-strlen(b), " (tos 
rx=0x%x,dscp=%d,ecn=%d)", report->common->TOS,  \
+           n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (tos 
rx=0x%x,dscp=%d,ecn=%d)", report->common->TOS,  \
                     DSCP_VALUE(report->common->TOS), 
ECN_VALUE(report->common->TOS));
        }
        FAIL_exit((n < 0 ), "fail append o-tos");
@@ -2755,15 +2755,15 @@ void reporter_print_connection_report (struct 
ConnectionInfo *report) {
        b += n;
     } else if (report->common->TOS) {
        if (isFullDuplex(report->common) || isBounceBack(report->common)) {
-           n = snprintf(b, SNBUFFERSIZE-strlen(b), " (tos 
rx/tx=0x%x,dscp=%d,ecn=%d/0x%x,dscp=%d,ecn=%d)", report->common->TOS, \
+           n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (tos 
rx/tx=0x%x,dscp=%d,ecn=%d/0x%x,dscp=%d,ecn=%d)", report->common->TOS, \
                     DSCP_VALUE(report->common->TOS), 
ECN_VALUE(report->common->TOS), \
                     report->common->TOS, \
                     DSCP_VALUE(report->common->TOS), 
ECN_VALUE(report->common->TOS));
        } else if (isReverse(report->common)) {
-           n = snprintf(b, SNBUFFERSIZE-strlen(b), " (tos 
rx=0x%x,dscp=%d,ecn=%d)", report->common->TOS, \
+           n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (tos 
rx=0x%x,dscp=%d,ecn=%d)", report->common->TOS, \
                     DSCP_VALUE(report->common->TOS), 
ECN_VALUE(report->common->TOS));
        } else {
-           n = snprintf(b, SNBUFFERSIZE-strlen(b), " (tos 
tx=0x%x,dscp=%d,ecn=%d)", report->common->TOS, \
+           n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (tos 
tx=0x%x,dscp=%d,ecn=%d)", report->common->TOS, \
                     DSCP_VALUE(report->common->TOS), 
ECN_VALUE(report->common->TOS));
        }
        FAIL_exit((n < 0), "fail append tos");
@@ -2772,7 +2772,7 @@ void reporter_print_connection_report (struct 
ConnectionInfo *report) {
     }
     if (isEnhanced(report->common) || isPeerVerDetect(report->common)) {
        if (report->peerversion[0] != '\0') {
-           n = snprintf(b, SNBUFFERSIZE-strlen(b), "%s", report->peerversion);
+           n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), "%s", 
report->peerversion);
            FAIL_exit((n < 0), "fail append peer ver");
            FAIL_exit((strlen(linebuffer) >= SNBUFFERSIZE), "buffer overflow 
peer ver");
            b += n;
@@ -2780,7 +2780,7 @@ void reporter_print_connection_report (struct 
ConnectionInfo *report) {
     }
 #if HAVE_DECL_TCP_QUICKACK
     if (isTcpQuickAck(report->common) && !isBounceBack(report->common)) {
-       n = snprintf(b, SNBUFFERSIZE-strlen(b), " (qack)");
+       n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (qack)");
        FAIL_exit((n < 0), "fail append peer qack");
        FAIL_exit((strlen(linebuffer) >= SNBUFFERSIZE), "buffer overflow peer 
qack");
        b += n;
@@ -2788,7 +2788,7 @@ void reporter_print_connection_report (struct 
ConnectionInfo *report) {
 #endif
 #if HAVE_TCP_STATS
     if (!isUDP(report->common) && (report->tcpinitstats.isValid) && 
isEnhanced(report->common)) {
-       n = snprintf(b, SNBUFFERSIZE-strlen(b), " (icwnd/mss/irtt=%" PRIdMAX 
"/%" PRIuLEAST32 "/%" PRIuLEAST32 ")", \
+       n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (icwnd/mss/irtt=%" 
PRIdMAX "/%" PRIuLEAST32 "/%" PRIuLEAST32 ")", \
                 report->tcpinitstats.cwnd, 
report->tcpinitstats.mss_negotiated, report->tcpinitstats.rtt);
        FAIL_exit((n < 0), "fail append tcpstats");
        FAIL_exit((strlen(linebuffer) >= SNBUFFERSIZE), "buffer overflow 
tcpstats");
@@ -2802,9 +2802,9 @@ void reporter_print_connection_report (struct 
ConnectionInfo *report) {
            iperf_formattime(timestr, sizeof(timestr), 
report->connect_timestamp, \
                             (isEnhanced(report->common) ? Milliseconds : 
Seconds), isUTC(report->common), YearThruSecTZ);
            if (!isUDP(report->common) && (report->common->ThreadMode == 
kMode_Client) && (report->tcpinitstats.connecttime > 0)) {
-               n = snprintf(b, SNBUFFERSIZE-strlen(b), " (ct=%4.2f ms) on %s", 
report->tcpinitstats.connecttime, timestr);
+               n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " (ct=%4.2f 
ms) on %s", report->tcpinitstats.connecttime, timestr);
            } else {
-               n = snprintf(b, SNBUFFERSIZE-strlen(b), " on %s", timestr);
+               n = snprintf(b, SNBUFFERSIZE-strlen(linebuffer), " on %s", 
timestr);
            }
            FAIL_exit((n < 0), "fail append ct");
            FAIL_exit((strlen(linebuffer) >= SNBUFFERSIZE), "buffer overflow 
ct");
-- 
2.47.0



_______________________________________________
Iperf-users mailing list
Iperf-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iperf-users

Reply via email to