1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
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
|