From f7a084969a5d501fcd489a5bcde6236f67273d8e Mon Sep 17 00:00:00 2001 From: kote Date: Fri, 6 Sep 2019 03:21:26 +0800 Subject: [PATCH] fixed #1387 --- daemon/UPnP.cpp | 15 +++++++++++---- daemon/UPnP.h | 1 + qt/i2pd_qt/i2pd_qt.pro | 4 +--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/daemon/UPnP.cpp b/daemon/UPnP.cpp index d112c7d2..b2ebb005 100644 --- a/daemon/UPnP.cpp +++ b/daemon/UPnP.cpp @@ -110,9 +110,10 @@ namespace transport } err = UPNP_GetValidIGD (m_Devlist, &m_upnpUrls, &m_upnpData, m_NetworkAddr, sizeof (m_NetworkAddr)); + m_upnpUrlsInitialized=err!=0; if (err == UPNP_IGD_VALID_CONNECTED) { - err = UPNP_GetExternalIPAddress (m_upnpUrls.controlURL, m_upnpData.first.servicetype, m_externalIPAddress); + err = UPNP_GetExternalIPAddress (m_upnpUrls.controlURL, m_upnpData.first.servicetype, m_externalIPAddress); if(err != UPNPCOMMAND_SUCCESS) { LogPrint (eLogError, "UPnP: unable to get external address: error ", err); @@ -218,11 +219,14 @@ namespace transport void UPnP::CloseMapping (std::shared_ptr address) { + if(!m_upnpUrlsInitialized) { + return; + } std::string strType (GetProto (address)), strPort (std::to_string (address->port)); int err = UPNPCOMMAND_SUCCESS; err = CheckMapping (strPort.c_str (), strType.c_str ()); - if (err == UPNPCOMMAND_SUCCESS) + if (err == UPNPCOMMAND_SUCCESS) { err = UPNP_DeletePortMapping (m_upnpUrls.controlURL, m_upnpData.first.servicetype, strPort.c_str (), strType.c_str (), NULL); LogPrint (eLogError, "UPnP: DeletePortMapping() returned : ", err); @@ -233,8 +237,11 @@ namespace transport { freeUPNPDevlist (m_Devlist); m_Devlist = 0; - FreeUPNPUrls (&m_upnpUrls); - } + if(m_upnpUrlsInitialized){ + FreeUPNPUrls (&m_upnpUrls); + m_upnpUrlsInitialized=false; + } + } std::string UPnP::GetProto (std::shared_ptr address) { diff --git a/daemon/UPnP.h b/daemon/UPnP.h index 48855f0c..e66f0aff 100644 --- a/daemon/UPnP.h +++ b/daemon/UPnP.h @@ -60,6 +60,7 @@ namespace transport std::mutex m_StartedMutex; boost::asio::io_service m_Service; boost::asio::deadline_timer m_Timer; + bool m_upnpUrlsInitialized=false; struct UPNPUrls m_upnpUrls; struct IGDdatas m_upnpData; diff --git a/qt/i2pd_qt/i2pd_qt.pro b/qt/i2pd_qt/i2pd_qt.pro index e6349855..15565c5c 100644 --- a/qt/i2pd_qt/i2pd_qt.pro +++ b/qt/i2pd_qt/i2pd_qt.pro @@ -6,9 +6,7 @@ TARGET = i2pd_qt TEMPLATE = app QMAKE_CXXFLAGS *= -std=c++11 -Wno-unused-parameter -Wno-maybe-uninitialized -# For now, disable UPnP which currently crashes in UPnP::Stop() -- https://github.com/PurpleI2P/i2pd/issues/1387 -#DEFINES += USE_UPNP -DEFINES -= USE_UPNP +DEFINES += USE_UPNP CONFIG(debug, debug|release) { message(Debug build)