From b83b974e924403b3ea0c5720f3a0ebd39e2f4dee Mon Sep 17 00:00:00 2001 From: ligd Date: Wed, 17 Mar 2021 14:34:22 +0800 Subject: [PATCH] rpmsg_socket: fix rpmsg_socket_device_destroy() multi-access Reason: When user call rpmsg_socket_close() at the same time rpmsg_socket_ns_unbind() is called by remote CPU, then will meet multi-access to rpmsg_socket_device_destroy() Fix: reuse recvlock to handle this Change-Id: I8f33658f19c56a4000382ff9355ff052c45afea0 Signed-off-by: ligd --- net/rpmsg/rpmsg_sockif.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/net/rpmsg/rpmsg_sockif.c b/net/rpmsg/rpmsg_sockif.c index 9fb961f402..33ebd754b5 100644 --- a/net/rpmsg/rpmsg_sockif.c +++ b/net/rpmsg/rpmsg_sockif.c @@ -386,7 +386,14 @@ static int rpmsg_socket_ept_cb(FAR struct rpmsg_endpoint *ept, static inline void rpmsg_socket_destroy_ept( FAR struct rpmsg_socket_conn_s *conn) { - if (conn && conn->ept.rdev) + if (!conn) + { + return; + } + + rpmsg_socket_lock(&conn->recvlock); + + if (conn->ept.rdev) { if (conn->backlog) { @@ -400,6 +407,8 @@ static inline void rpmsg_socket_destroy_ept( rpmsg_socket_post(&conn->recvsem); rpmsg_socket_pollnotify(conn, POLLIN | POLLOUT); } + + rpmsg_socket_unlock(&conn->recvlock); } static void rpmsg_socket_ns_unbind(FAR struct rpmsg_endpoint *ept)