diff --git a/src/add-ons/kernel/network/protocols/tcp/EndpointManager.cpp b/src/add-ons/kernel/network/protocols/tcp/EndpointManager.cpp index e6980a94dd..c10f72021c 100644 --- a/src/add-ons/kernel/network/protocols/tcp/EndpointManager.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/EndpointManager.cpp @@ -314,11 +314,14 @@ EndpointManager::Unbind(TCPEndpoint *endpoint) TCPEndpoint *other = _LookupEndpoint(gAddressModule->get_port((sockaddr *)&endpoint->socket->address)); if (other != endpoint) { // remove endpoint from the list of endpoints with the same port - while (other->fEndpointNextWithSamePort != endpoint) { + while (other != NULL && other->fEndpointNextWithSamePort != endpoint) { other = other->fEndpointNextWithSamePort; } - other->fEndpointNextWithSamePort = endpoint->fEndpointNextWithSamePort; + if (other != NULL) + other->fEndpointNextWithSamePort = endpoint->fEndpointNextWithSamePort; + else + panic("bound endpoint %p not in hash!", endpoint); } else { // we need to replace the first endpoint in the list hash_remove(fEndpointHash, endpoint); diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp index 721a06ef99..e1765f48c9 100644 --- a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp @@ -102,6 +102,8 @@ TCPEndpoint::TCPEndpoint(net_socket *socket) TCPEndpoint::~TCPEndpoint() { + recursive_lock_lock(&fLock); + gStackModule->cancel_timer(&fRetransmitTimer); gStackModule->cancel_timer(&fPersistTimer); gStackModule->cancel_timer(&fDelayedAcknowledgeTimer); @@ -1215,6 +1217,8 @@ TCPEndpoint::_RetransmitTimer(net_timer *timer, void *data) TCPEndpoint *endpoint = (TCPEndpoint *)data; RecursiveLocker locker(endpoint->Lock()); + if (!locker.IsLocked()) + return; endpoint->fSendNext = endpoint->fSendUnacknowledged; endpoint->_SendQueued(); @@ -1228,6 +1232,9 @@ TCPEndpoint::_PersistTimer(net_timer *timer, void *data) TCPEndpoint *endpoint = (TCPEndpoint *)data; RecursiveLocker locker(endpoint->Lock()); + if (!locker.IsLocked()) + return; + endpoint->_SendQueued(true); } @@ -1238,6 +1245,9 @@ TCPEndpoint::_DelayedAcknowledgeTimer(struct net_timer *timer, void *data) TCPEndpoint *endpoint = (TCPEndpoint *)data; RecursiveLocker locker(endpoint->Lock()); + if (!locker.IsLocked()) + return; + endpoint->_SendQueued(true); } @@ -1247,7 +1257,9 @@ TCPEndpoint::_TimeWaitTimer(struct net_timer *timer, void *data) { TCPEndpoint *endpoint = (TCPEndpoint *)data; - recursive_lock_lock(&endpoint->Lock()); + if (recursive_lock_lock(&endpoint->Lock()) < B_OK) + return; + gSocketModule->delete_socket(endpoint->socket); }