From d4dac81eb691e082e7a7c88bf2148e9213a0a244 Mon Sep 17 00:00:00 2001 From: Taylor Richards Date: Fri, 27 Feb 2026 22:37:42 -0500 Subject: [PATCH] fix portfwd issue when dealing with server response failures An upstream bug in libpcpnatpmp caused it to not pass along ping failure messages in the internal state which then triggered multiple issues with both the library itself and FSO. This fixes the bug in the pcp library and takes care of the portfwd log spam issues in FSO as well. --- code/network/multi_portfwd.cpp | 10 ++++++++-- lib/libpcpnatpmp/src/pcp_event_handler.c | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/code/network/multi_portfwd.cpp b/code/network/multi_portfwd.cpp index d1184947d60..b2f410e3fa5 100644 --- a/code/network/multi_portfwd.cpp +++ b/code/network/multi_portfwd.cpp @@ -98,6 +98,7 @@ void multi_port_forward_init() void multi_port_forward_do() { + static bool failed_before = false; pcp_fstate_e state; size_t info_count = 0; int wait_ms; @@ -117,7 +118,10 @@ void multi_port_forward_do() // check progress and log if needed if ( pcp_eval_flow_state(PF_pcp_flow, &state) ) { if (state == pcp_state_failed) { - ml_string("Port forward => Mapping failed!"); + if ( !failed_before ) { + ml_string("Port forward => Mapping failed!"); + failed_before = true; // reduce log spam + } } else if (state == pcp_state_succeeded) { pcp_flow_info_t *flow_info = pcp_flow_get_info(PF_pcp_flow, &info_count); @@ -143,6 +147,8 @@ void multi_port_forward_do() ml_printf("Port forward => Mapping valid until %s", time_str); } + failed_before = false; + if (flow_info) { free(flow_info); // system call, allocated in lib ** don't change! ** } @@ -178,7 +184,7 @@ void multi_port_forward_close() #ifndef NDEBUG static void PF_logger_fn(pcp_loglvl_e /* lvl */, const char *msg) { - nprintf(("portfwd", "Port forward => %s", msg)); + nprintf(("portfwd", "Port forward => %s\n", msg)); } #endif diff --git a/lib/libpcpnatpmp/src/pcp_event_handler.c b/lib/libpcpnatpmp/src/pcp_event_handler.c index 72d06145a74..06c3a65883c 100644 --- a/lib/libpcpnatpmp/src/pcp_event_handler.c +++ b/lib/libpcpnatpmp/src/pcp_event_handler.c @@ -756,6 +756,7 @@ static int get_first_flow_iter(pcp_flow_t *f, void *data) { case pfs_idle: case pfs_wait_for_server_init: case pfs_send: + case pfs_failed: d->msg = f; return 1; default: