couple more code fixes, fix REST API initialization on FNE to prevent early REST calls from crashing the FNE; add locking support for network internals when REST APIs are called; fix memory leak for failed network logins;

pull/121/head
Bryan Biedenkapp 4 weeks ago
parent c3c34018fd
commit b7f55d9323

@ -108,8 +108,9 @@ bool AffiliationLookup::unitDereg(uint32_t srcId, bool automatic)
m_unitRegTable.unlock();
m_unitRegTable.erase(it);
ret = true;
} else {
m_unitRegTable.unlock();
}
m_unitRegTable.unlock();
if (ret) {
if (m_unitDereg != nullptr) {

@ -186,14 +186,14 @@ int HostFNE::run()
m_ridLookup = new RadioIdLookup(ridLookupFile, ridReloadTime, true);
m_ridLookup->read();
// initialize REST API
initializeRESTAPI();
// initialize master networking
ret = createMasterNetwork();
if (!ret)
return EXIT_FAILURE;
// initialize REST API
initializeRESTAPI();
// initialize peer networking
ret = createPeerNetworks();
if (!ret)
@ -274,6 +274,11 @@ int HostFNE::run()
}
// shutdown threads
if (m_RESTAPI != nullptr) {
m_RESTAPI->close();
delete m_RESTAPI;
}
if (m_network != nullptr) {
m_network->close();
delete m_network;
@ -291,11 +296,6 @@ int HostFNE::run()
}
m_peerNetworks.clear();
if (m_RESTAPI != nullptr) {
m_RESTAPI->close();
delete m_RESTAPI;
}
if (m_tidLookup != nullptr) {
m_tidLookup->setReloadTime(0U); // no reload
m_tidLookup->stop();
@ -519,6 +519,7 @@ bool HostFNE::initializeRESTAPI()
if (restApiEnable) {
m_RESTAPI = new RESTAPI(restApiAddress, restApiPort, restApiPassword, restApiSSLKey, restApiSSLCert, restApiEnableSSL, this, restApiDebug);
m_RESTAPI->setLookups(m_ridLookup, m_tidLookup, m_peerListLookup, m_adjSiteMapLookup, m_cryptoLookup);
m_RESTAPI->setNetwork(m_network);
bool ret = m_RESTAPI->open();
if (!ret) {
delete m_RESTAPI;
@ -656,10 +657,6 @@ bool HostFNE::createMasterNetwork()
m_network->setLookups(m_ridLookup, m_tidLookup, m_peerListLookup, m_cryptoLookup, m_adjSiteMapLookup);
if (m_RESTAPI != nullptr) {
m_RESTAPI->setNetwork(m_network);
}
bool ret = m_network->open();
if (!ret) {
delete m_network;

@ -805,6 +805,7 @@ void RESTAPI::restAPI_PutAuth(const HTTPPayload& request, HTTPPayload& reply, co
invalidateHostToken(host);
errorPayload(reply, "invalid password");
LogError(LOG_REST, "failed authentication attempt from host %s", host.c_str());
delete[] passwordHash;
return;
}
@ -875,18 +876,20 @@ void RESTAPI::restAPI_GetPeerQuery(const HTTPPayload& request, HTTPPayload& repl
json::array peers = json::array();
if (m_network != nullptr) {
if (m_network->m_peers.size() > 0) {
m_network->m_peers.shared_lock();
for (auto entry : m_network->m_peers) {
uint32_t peerId = entry.first;
network::FNEPeerConnection* peer = entry.second;
if (peer != nullptr) {
if (m_debug) {
LogDebug(LOG_REST, "preparing Peer %u (%s) for REST API query", peerId, peer->address().c_str());
LogDebug(LOG_REST, "preparing PEER %u (%s) for REST API query", peerId, peer->address().c_str());
}
json::object peerObj = m_network->fneConnObject(peerId, peer);
peers.push_back(json::value(peerObj));
}
}
m_network->m_peers.shared_unlock();
}
else {
LogError(LOG_REST, "peer query failed, no peers connected to this FNE");
@ -1798,6 +1801,7 @@ void RESTAPI::restAPI_GetStats(const HTTPPayload& request, HTTPPayload& reply, c
// peer statistics (right now this is just a list of connected peers)
json::array peerStats = json::array();
if (m_network->m_peers.size() > 0) {
m_network->m_peers.shared_lock();
for (auto entry : m_network->m_peers) {
uint32_t peerId = entry.first;
network::FNEPeerConnection* peer = entry.second;
@ -1847,6 +1851,7 @@ void RESTAPI::restAPI_GetStats(const HTTPPayload& request, HTTPPayload& reply, c
peerStats.push_back(json::value(peerObj));
}
}
m_network->m_peers.shared_unlock();
}
response["peerStats"].set<json::array>(peerStats);
@ -2078,6 +2083,8 @@ void RESTAPI::restAPI_GetAffList(const HTTPPayload& request, HTTPPayload& reply,
if (m_network != nullptr) {
uint32_t totalAffiliations = 0U;
if (m_network->m_peers.size() > 0) {
m_network->m_peers.shared_lock();
m_network->m_peerAffiliations.lock(false);
for (auto entry : m_network->m_peers) {
uint32_t peerId = entry.first;
network::FNEPeerConnection* peer = entry.second;
@ -2108,6 +2115,8 @@ void RESTAPI::restAPI_GetAffList(const HTTPPayload& request, HTTPPayload& reply,
}
}
}
m_network->m_peerAffiliations.unlock();
m_network->m_peers.shared_unlock();
}
response["totalAffiliations"].set<uint32_t>(totalAffiliations);

@ -442,6 +442,7 @@ void RESTAPI::restAPI_PutAuth(const HTTPPayload& request, HTTPPayload& reply, co
invalidateHostToken(host);
errorPayload(reply, "invalid password");
LogError(LOG_REST, "failed authentication attempt from host %s", host.c_str());
delete[] passwordHash;
return;
}

Loading…
Cancel
Save

Powered by TurnKey Linux.