mirror of
https://github.com/apache/nuttx.git
synced 2026-06-06 00:14:22 +08:00
socket_rpmsg: add lock to bind list, reject if list more than backlog
Change-Id: Ibdbe3d931d1b14601d9c5f3fb95cd87aacb4e5e1 Signed-off-by: ligd <liguiding1@xiaomi.com>
This commit is contained in:
+28
-11
@@ -454,8 +454,8 @@ static void rpmsg_socket_ns_bind(FAR struct rpmsg_device *rdev,
|
||||
FAR struct rpmsg_socket_conn_s *server = priv;
|
||||
FAR struct rpmsg_socket_conn_s *tmp;
|
||||
FAR struct rpmsg_socket_conn_s *new;
|
||||
int cnt = 0;
|
||||
int ret;
|
||||
int i = 0;
|
||||
|
||||
if (strncmp(name, server->rpaddr.rp_name,
|
||||
strlen(server->rpaddr.rp_name)))
|
||||
@@ -471,14 +471,6 @@ static void rpmsg_socket_ns_bind(FAR struct rpmsg_device *rdev,
|
||||
return;
|
||||
}
|
||||
|
||||
for (tmp = server; tmp->next; tmp = tmp->next)
|
||||
{
|
||||
if (++i > server->backlog)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
new = rpmsg_socket_alloc();
|
||||
if (!new)
|
||||
{
|
||||
@@ -505,8 +497,25 @@ static void rpmsg_socket_ns_bind(FAR struct rpmsg_device *rdev,
|
||||
strcpy(new->rpaddr.rp_cpu, rpmsg_get_cpuname(rdev));
|
||||
strcpy(new->rpaddr.rp_name, name);
|
||||
|
||||
rpmsg_socket_lock(&server->recvlock);
|
||||
|
||||
for (tmp = server; tmp->next; tmp = tmp->next)
|
||||
{
|
||||
if (++cnt >= server->backlog)
|
||||
{
|
||||
/* Reject the connection */
|
||||
|
||||
rpmsg_destroy_ept(&new->ept);
|
||||
rpmsg_socket_free(new);
|
||||
rpmsg_socket_lock(&server->recvlock);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
tmp->next = new;
|
||||
|
||||
rpmsg_socket_unlock(&server->recvlock);
|
||||
|
||||
rpmsg_socket_post(&server->recvsem);
|
||||
rpmsg_socket_pollnotify(server, POLLIN);
|
||||
}
|
||||
@@ -713,13 +722,21 @@ static int rpmsg_socket_accept(FAR struct socket *psock,
|
||||
|
||||
while (1)
|
||||
{
|
||||
FAR struct rpmsg_socket_conn_s *conn = NULL;
|
||||
|
||||
rpmsg_socket_lock(&server->recvlock);
|
||||
|
||||
if (server->next)
|
||||
{
|
||||
FAR struct rpmsg_socket_conn_s *conn = server->next;
|
||||
|
||||
conn = server->next;
|
||||
server->next = conn->next;
|
||||
conn->next = NULL;
|
||||
}
|
||||
|
||||
rpmsg_socket_unlock(&server->recvlock);
|
||||
|
||||
if (conn)
|
||||
{
|
||||
rpmsg_socket_sync(conn, _SO_TIMEOUT(psock->s_rcvtimeo));
|
||||
|
||||
rpmsg_register_callback(conn,
|
||||
|
||||
Reference in New Issue
Block a user