diff --git a/net/local/local_release.c b/net/local/local_release.c index d269945d61930..575b90a528e53 100644 --- a/net/local/local_release.c +++ b/net/local/local_release.c @@ -66,9 +66,37 @@ int local_release(FAR struct local_conn_s *conn) DEBUGASSERT(conn->lc_state != LOCAL_STATE_ACCEPT); + if (conn->lc_state == LOCAL_STATE_CONNECTING) + { + FAR struct local_conn_s *server = NULL; + FAR struct local_conn_s *client; + FAR dq_entry_t *waiter = NULL; + + while ((server = local_nextconn(server)) && waiter == NULL) + { + if (server->lc_state == LOCAL_STATE_LISTENING) + { + for (waiter = dq_peek(&server->u.server.lc_waiters); + waiter; + waiter = dq_next(&client->u.client.lc_waiter)) + { + if (&conn->u.client.lc_waiter == waiter) + { + dq_rem(waiter, &server->u.server.lc_waiters); + server->u.server.lc_pending--; + break; + } + + client = container_of(waiter, struct local_conn_s, + u.client.lc_waiter); + } + } + } + } + /* Is the socket is listening socket (SOCK_STREAM server) */ - if (conn->lc_state == LOCAL_STATE_LISTENING) + else if (conn->lc_state == LOCAL_STATE_LISTENING) { FAR struct local_conn_s *client; FAR dq_entry_t *waiter;