Skip to content

Commit a910838

Browse files
author
Matt Corallo
committed
Get ext. IP from UPnP, make sure addrMe IsRoutable() in version.
This fixes a potential bug where some NATs may replace the node's interal IP with its external IP in version messages, causing incorrect checksums when version messages begin being checksummed on February 14, 2012.
1 parent 7de7913 commit a910838

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

src/net.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,6 +1155,26 @@ void ThreadMapPort2(void* parg)
11551155
r = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr));
11561156
if (r == 1)
11571157
{
1158+
if (!addrLocalHost.IsRoutable())
1159+
{
1160+
char externalIPAddress[40];
1161+
r = UPNP_GetExternalIPAddress(urls.controlURL, data.first.servicetype, externalIPAddress);
1162+
if(r != UPNPCOMMAND_SUCCESS)
1163+
printf("UPnP: GetExternalIPAddress() returned %d\n", r);
1164+
else
1165+
{
1166+
if(externalIPAddress[0])
1167+
{
1168+
printf("UPnP: ExternalIPAddress = %s\n", externalIPAddress);
1169+
CAddress addrExternalFromUPnP(externalIPAddress, 0, false, nLocalServices);
1170+
if (addrExternalFromUPnP.IsRoutable())
1171+
addrLocalHost = addrExternalFromUPnP;
1172+
}
1173+
else
1174+
printf("UPnP: GetExternalIPAddress failed.\n");
1175+
}
1176+
}
1177+
11581178
char intClient[16];
11591179
char intPort[6];
11601180
string strDesc = "Bitcoin " + FormatFullVersion();

src/net.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ class CNode
360360
/// when NTP implemented, change to just nTime = GetAdjustedTime()
361361
int64 nTime = (fInbound ? GetAdjustedTime() : GetTime());
362362
CAddress addrYou = (fUseProxy ? CAddress("0.0.0.0") : addr);
363-
CAddress addrMe = (fUseProxy ? CAddress("0.0.0.0") : addrLocalHost);
363+
CAddress addrMe = (fUseProxy || !addrLocalHost.IsRoutable() ? CAddress("0.0.0.0") : addrLocalHost);
364364
RAND_bytes((unsigned char*)&nLocalHostNonce, sizeof(nLocalHostNonce));
365365
PushMessage("version", VERSION, nLocalServices, nTime, addrYou, addrMe,
366366
nLocalHostNonce, std::string(pszSubVer), nBestHeight);

0 commit comments

Comments
 (0)