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:
parent
92eec01f56
commit
38c5837d2b
@ -459,8 +459,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)))
|
||||
@ -476,14 +476,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)
|
||||
{
|
||||
@ -510,8 +502,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_socket_unlock(&server->recvlock);
|
||||
rpmsg_destroy_ept(&new->ept);
|
||||
rpmsg_socket_free(new);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
tmp->next = new;
|
||||
|
||||
rpmsg_socket_unlock(&server->recvlock);
|
||||
|
||||
rpmsg_socket_post(&server->recvsem);
|
||||
rpmsg_socket_pollnotify(server, POLLIN);
|
||||
}
|
||||
@ -718,13 +727,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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user