Fix uninitialized memory usage when UPNP_GetValidIGD() returns 3

This commit is contained in:
Cameron Gutman 2018-10-20 18:31:33 -07:00
parent 9a95d075e6
commit dad9b01a6f
2 changed files with 35 additions and 32 deletions

View File

@ -269,6 +269,10 @@ bool UPnPHandleDeviceList(struct UPNPDev* list, bool ipv6, bool enable)
printf("No UPnP device found!" NL); printf("No UPnP device found!" NL);
return false; return false;
} }
else if (ret == 3) {
printf("No UPnP IGD found!" NL);
goto Exit;
}
else if (ret == 1) { else if (ret == 1) {
printf("Found a connected UPnP IGD" NL); printf("Found a connected UPnP IGD" NL);
} }
@ -278,12 +282,6 @@ bool UPnPHandleDeviceList(struct UPNPDev* list, bool ipv6, bool enable)
// Even if we are able to add forwarding entries, go ahead and try NAT-PMP // Even if we are able to add forwarding entries, go ahead and try NAT-PMP
success = false; success = false;
} }
else if (ret == 3) {
printf("Found UPnP devices (assuming it's an IGD) (!)" NL);
// Even if we are able to add forwarding entries, go ahead and try NAT-PMP
success = false;
}
else { else {
printf("UPNP_GetValidIGD() failed: %d" NL, ret); printf("UPNP_GetValidIGD() failed: %d" NL, ret);
goto Exit; goto Exit;

View File

@ -529,34 +529,39 @@ bool CheckWANAccess(PSOCKADDR_IN wanAddr, bool* foundPortForwardingRules)
char wanAddrStr[128]; char wanAddrStr[128];
int ret = UPNP_GetValidIGD(ipv4Devs, &urls, &data, myAddr, sizeof(myAddr)); int ret = UPNP_GetValidIGD(ipv4Devs, &urls, &data, myAddr, sizeof(myAddr));
if (ret != 0) { if (ret != 0) {
ret = UPNP_GetExternalIPAddress(urls.controlURL, data.first.servicetype, wanAddrStr); // Connected or disconnected IGD
if (ret == UPNPCOMMAND_SUCCESS) { if (ret == 1 || ret == 2) {
wanAddr->sin_addr.S_un.S_addr = inet_addr(wanAddrStr); ret = UPNP_GetExternalIPAddress(urls.controlURL, data.first.servicetype, wanAddrStr);
printf("%s (UPnP)\n", wanAddrStr); if (ret == UPNPCOMMAND_SUCCESS) {
gotWanAddress = true; wanAddr->sin_addr.S_un.S_addr = inet_addr(wanAddrStr);
printf("%s (UPnP)\n", wanAddrStr);
gotWanAddress = true;
}
char conflictMessage[512];
*foundPortForwardingRules = true;
for (int i = 0; i < ARRAYSIZE(k_Ports); i++) {
char conflictEntry[128];
UPnPPortStatus status = UPnPCheckPort(&urls, &data, k_Ports[i].proto, myAddr, k_Ports[i].port, conflictEntry);
if (status != OK) {
*foundPortForwardingRules = false;
}
switch (status)
{
case CONFLICTED:
snprintf(conflictMessage, sizeof(conflictMessage),
"Detected a port forwarding conflict with another PC on your network: %s\n\n"
"Remove that PC from your network or uninstall the Moonlight Internet Streaming Service from it, then restart your router.",
conflictEntry);
DisplayMessage(conflictMessage);
return false;
default:
continue;
}
}
} }
char conflictMessage[512]; FreeUPNPUrls(&urls);
*foundPortForwardingRules = true;
for (int i = 0; i < ARRAYSIZE(k_Ports); i++) {
char conflictEntry[128];
UPnPPortStatus status = UPnPCheckPort(&urls, &data, k_Ports[i].proto, myAddr, k_Ports[i].port, conflictEntry);
if (status != OK) {
*foundPortForwardingRules = false;
}
switch (status)
{
case CONFLICTED:
snprintf(conflictMessage, sizeof(conflictMessage),
"Detected a port forwarding conflict with another PC on your network: %s\n\n"
"Remove that PC from your network or uninstall the Moonlight Internet Streaming Service from it, then restart your router.",
conflictEntry);
DisplayMessage(conflictMessage);
return false;
default:
continue;
}
}
} }
} }