diff options
author | Joseph Henry <joseph.henry@zerotier.com> | 2015-09-24 16:15:14 -0400 |
---|---|---|
committer | Joseph Henry <joseph.henry@zerotier.com> | 2015-09-24 16:15:14 -0400 |
commit | c25ceaf06bc60edfa09281610d5c3c1c9f5f6706 (patch) | |
tree | a8fe79d80a531b3ae4270351a0b916865eaa3fbe | |
parent | b263926ea66b7ab06b8f84755a68d21bdf6defe3 (diff) | |
download | infinitytier-c25ceaf06bc60edfa09281610d5c3c1c9f5f6706.tar.gz infinitytier-c25ceaf06bc60edfa09281610d5c3c1c9f5f6706.zip |
Fixed recursive lock problem in closeConnection
-rw-r--r-- | netcon/LWIPStack.hpp | 3 | ||||
-rw-r--r-- | netcon/NetconEthernetTap.cpp | 21 |
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)); |