https://github.com/zerotier/ZeroTierOne/issues/2332
https://gitlab.archlinux.org/archlinux/packaging/packages/zerotier-one/-/blob/d718c510d849ff9a8124761d51971a668591bd1e/0001-miniupnpc.patch

From bc83c2df2d2063a94cda78ed9b454abe032f4ed9 Mon Sep 17 00:00:00 2001
From: Christian Hesse <mail@eworm.de>
Date: Wed, 10 Sep 2025 16:28:05 +0200
Subject: [PATCH 1/2] shrink variable size

This is what upstream miniupnpc uses...
--- a/osdep/PortMapper.cpp
+++ b/osdep/PortMapper.cpp
@@ -195,7 +195,7 @@ class PortMapperImpl {
 			// UPnP mode
 			// ---------------------------------------------------------------------
 			if (mode == 1) {
-				char lanaddr[4096];
+				char lanaddr[64];
 				char externalip[4096];	 // no range checking? so make these buffers larger than any UDP packet a uPnP server could send us as a precaution :P
 				char inport[16];
 				char outport[16];

From 2bad879a04caec036e4ee35879f2353f2dac71bf Mon Sep 17 00:00:00 2001
From: Christian Hesse <mail@eworm.de>
Date: Wed, 10 Sep 2025 16:30:21 +0200
Subject: [PATCH 2/2] add missing function parameter

This changed with miniupnpc 2.2.8:

https://github.com/miniupnp/miniupnp/commit/c0a50ce33e3b99ce8a96fd43049bb5b53ffac62f

Warning: This is not a proper patch suitable for upstream! It assumes the
parameter is always there, which is not true for older versions.
So handle with care!
--- a/osdep/PortMapper.cpp
+++ b/osdep/PortMapper.cpp
@@ -196,6 +196,7 @@ class PortMapperImpl {
 			// ---------------------------------------------------------------------
 			if (mode == 1) {
 				char lanaddr[64];
+				char wanaddr[64];
 				char externalip[4096];	 // no range checking? so make these buffers larger than any UDP packet a uPnP server could send us as a precaution :P
 				char inport[16];
 				char outport[16];
@@ -216,13 +217,14 @@ class PortMapperImpl {
 #endif
 
 					memset(lanaddr, 0, sizeof(lanaddr));
+					memset(wanaddr, 0, sizeof(wanaddr));
 					memset(externalip, 0, sizeof(externalip));
 					memset(&urls, 0, sizeof(urls));
 					memset(&data, 0, sizeof(data));
 					OSUtils::ztsnprintf(inport, sizeof(inport), "%d", localPort);
 
 					int foundValidIGD = 0;
-					if ((foundValidIGD = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr))) && (lanaddr[0])) {
+					if ((foundValidIGD = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr), wanaddr, sizeof(wanaddr))) && (lanaddr[0])) {
 #ifdef ZT_PORTMAPPER_TRACE
 						PM_TRACE("PortMapper: UPnP: my LAN IP address: %s" ZT_EOL_S, lanaddr);
 #endif
