summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Henry <joseph.henry@zerotier.com>2015-09-24 16:15:14 -0400
committerJoseph Henry <joseph.henry@zerotier.com>2015-09-24 16:15:14 -0400
commitc25ceaf06bc60edfa09281610d5c3c1c9f5f6706 (patch)
treea8fe79d80a531b3ae4270351a0b916865eaa3fbe
parentb263926ea66b7ab06b8f84755a68d21bdf6defe3 (diff)
downloadinfinitytier-c25ceaf06bc60edfa09281610d5c3c1c9f5f6706.tar.gz
infinitytier-c25ceaf06bc60edfa09281610d5c3c1c9f5f6706.zip
Fixed recursive lock problem in closeConnection
-rw-r--r--netcon/LWIPStack.hpp3
-rw-r--r--netcon/NetconEthernetTap.cpp21
2 files changed, 15 insertions, 9 deletions
diff --git a/netcon/LWIPStack.hpp b/netcon/LWIPStack.hpp
index 82b06377..ee1a8871 100644
--- a/netcon/LWIPStack.hpp
+++ b/netcon/LWIPStack.hpp
@@ -145,6 +145,9 @@ public:
void (*_netif_set_up)(NETIF_SET_UP_SIG);
void (*_netif_poll)(NETIF_POLL_SIG);
+
+ Mutex _lock;
+
LWIPStack(const char* path) :
_libref(NULL)
{
diff --git a/netcon/NetconEthernetTap.cpp b/netcon/NetconEthernetTap.cpp
index a060b97c..30217b6f 100644
--- a/netcon/NetconEthernetTap.cpp
+++ b/netcon/NetconEthernetTap.cpp
@@ -292,14 +292,14 @@ void NetconEthernetTap::closeAllClients()
void NetconEthernetTap::closeConnection(NetconConnection *conn)
{
NetconClient *client = conn->owner;
- lwipstack->tcp_arg(conn->pcb, NULL);
- lwipstack->tcp_sent(conn->pcb, NULL);
- lwipstack->tcp_recv(conn->pcb, NULL);
- lwipstack->tcp_err(conn->pcb, NULL);
- lwipstack->tcp_poll(conn->pcb, NULL, 0);
- lwipstack->tcp_close(conn->pcb);
+ lwipstack->_tcp_arg(conn->pcb, NULL);
+ lwipstack->_tcp_sent(conn->pcb, NULL);
+ lwipstack->_tcp_recv(conn->pcb, NULL);
+ lwipstack->_tcp_err(conn->pcb, NULL);
+ lwipstack->_tcp_poll(conn->pcb, NULL, 0);
+ lwipstack->_tcp_close(conn->pcb);
_phy.close(conn->sock);
- lwipstack->tcp_close(conn->pcb);
+ lwipstack->_tcp_close(conn->pcb);
client->removeConnection(conn->sock);
}
@@ -308,8 +308,11 @@ void NetconEthernetTap::closeConnection(NetconConnection *conn)
*/
void NetconEthernetTap::closeClient(NetconClient *client)
{
- closeConnection(client->rpc);
- closeConnection(client->unmapped_conn);
+ {
+ Mutex::Lock _l(lwipstack->_lock);
+ closeConnection(client->rpc);
+ closeConnection(client->unmapped_conn);
+ }
for(size_t i=0; i<client->connections.size(); i++)
{
close(_phy.getDescriptor(client->connections[i]->sock));