diff --git a/src/add-ons/kernel/network/stack/net_socket.cpp b/src/add-ons/kernel/network/stack/net_socket.cpp index 66fd82f33d..1f0b012f58 100644 --- a/src/add-ons/kernel/network/stack/net_socket.cpp +++ b/src/add-ons/kernel/network/stack/net_socket.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include @@ -190,6 +191,14 @@ socket_receive_data(net_socket *socket, size_t length, uint32 flags, status_t socket_spawn_pending(net_socket *parent, net_socket **_socket) { + BenaphoreLocker locker(parent->lock); + + // We actually accept more pending connections to compensate for those + // that never complete, and also make sure at least a single connection + // can always be accepted + if (parent->child_count > 3 * parent->max_backlog / 2) + return ENOBUFS; + net_socket *socket; status_t status = socket_create(parent->family, parent->type, parent->protocol, &socket); if (status < B_OK) @@ -198,7 +207,7 @@ socket_spawn_pending(net_socket *parent, net_socket **_socket) // inherit parent's properties socket->send = parent->send; socket->receive = parent->receive; - socket->options = parent->options; + socket->options = parent->options & ~SO_ACCEPTCONN; socket->linger = parent->linger; memcpy(&socket->address, &parent->address, parent->address.ss_len); memcpy(&socket->peer, &parent->peer, parent->peer.ss_len);