This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 37a30023f5 nuttx/drivers: add ept_release_cb for destroy server
resource
37a30023f5 is described below
commit 37a30023f50a85684ab96b77d838f822ba30e029
Author: yintao <[email protected]>
AuthorDate: Wed Jul 10 21:22:38 2024 +0800
nuttx/drivers: add ept_release_cb for destroy server resource
use ept_release_cb to destory rpmsg services server dile resource
to avoid the used-after-free issue
Signed-off-by: yintao <[email protected]>
---
drivers/clk/clk_rpmsg.c | 48 ++++++++--------
drivers/ioexpander/ioe_rpmsg.c | 15 +++--
drivers/misc/rpmsgblk_server.c | 29 +++++-----
drivers/misc/rpmsgdev_server.c | 69 +++++++++++------------
drivers/mtd/rpmsgmtd_server.c | 29 +++++-----
drivers/power/supply/regulator_rpmsg.c | 24 ++++----
drivers/reset/reset_rpmsg.c | 23 ++++----
drivers/sensors/sensor_rpmsg.c | 75 +++++++++++++------------
drivers/syslog/syslog_rpmsg_server.c | 44 +++++++--------
drivers/timers/rpmsg_rtc.c | 29 +++++-----
drivers/usrsock/usrsock_rpmsg_server.c | 63 ++++++++++-----------
drivers/wireless/bluetooth/bt_rpmsghci_server.c | 15 +++--
fs/rpmsgfs/rpmsgfs_server.c | 57 +++++++++----------
13 files changed, 258 insertions(+), 262 deletions(-)
diff --git a/drivers/clk/clk_rpmsg.c b/drivers/clk/clk_rpmsg.c
index 4f7d669342..97ab7a880c 100644
--- a/drivers/clk/clk_rpmsg.c
+++ b/drivers/clk/clk_rpmsg.c
@@ -166,7 +166,6 @@ static void clk_rpmsg_server_bind(FAR struct rpmsg_device
*rdev,
FAR void *priv_,
FAR const char *name,
uint32_t dest);
-static void clk_rpmsg_server_unbind(FAR struct rpmsg_endpoint *ept);
static int clk_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept,
FAR void *data, size_t len,
@@ -514,6 +513,27 @@ static bool clk_rpmsg_server_match(FAR struct rpmsg_device
*rdev,
return !strcmp(name, CLK_RPMSG_EPT_NAME);
}
+static void clk_rpmsg_server_ept_release(FAR struct rpmsg_endpoint *ept)
+{
+ FAR struct clk_rpmsg_server_s *priv = ept->priv;
+ FAR struct clk_rpmsg_s *clkrp_tmp;
+ FAR struct clk_rpmsg_s *clkrp;
+
+ list_for_every_entry_safe(&priv->clk_list, clkrp, clkrp_tmp,
+ struct clk_rpmsg_s, node)
+ {
+ if (clkrp->enable)
+ {
+ clk_disable(clkrp->clk);
+ }
+
+ list_delete(&clkrp->node);
+ kmm_free(clkrp);
+ }
+
+ kmm_free(priv);
+}
+
static void clk_rpmsg_server_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_,
FAR const char *name,
@@ -528,36 +548,14 @@ static void clk_rpmsg_server_bind(FAR struct rpmsg_device
*rdev,
}
priv->ept.priv = priv;
+ priv->ept.release_cb = clk_rpmsg_server_ept_release;
list_initialize(&priv->clk_list);
rpmsg_create_ept(&priv->ept, rdev, name,
RPMSG_ADDR_ANY, RPMSG_ADDR_ANY,
clk_rpmsg_ept_cb,
- clk_rpmsg_server_unbind);
-}
-
-static void clk_rpmsg_server_unbind(FAR struct rpmsg_endpoint *ept)
-{
- FAR struct clk_rpmsg_server_s *priv = ept->priv;
- FAR struct clk_rpmsg_s *clkrp_tmp;
- FAR struct clk_rpmsg_s *clkrp;
-
- list_for_every_entry_safe(&priv->clk_list, clkrp, clkrp_tmp,
- struct clk_rpmsg_s, node)
- {
- if (clkrp->enable)
- {
- clk_disable(clkrp->clk);
- }
-
- list_delete(&clkrp->node);
- kmm_free(clkrp);
- }
-
- rpmsg_destroy_ept(ept);
-
- kmm_free(priv);
+ rpmsg_destroy_ept);
}
static void clk_rpmsg_client_created(FAR struct rpmsg_device *rdev,
diff --git a/drivers/ioexpander/ioe_rpmsg.c b/drivers/ioexpander/ioe_rpmsg.c
index 5242eab05d..c97ef1299d 100644
--- a/drivers/ioexpander/ioe_rpmsg.c
+++ b/drivers/ioexpander/ioe_rpmsg.c
@@ -602,13 +602,6 @@ static int ioe_rpmsg_server_ept_cb(FAR struct
rpmsg_endpoint *ept,
return 0;
}
-static void ioe_rpmsg_server_unbind(FAR struct rpmsg_endpoint *ept)
-{
- rpmsg_destroy_ept(ept);
-
- kmm_free(ept);
-}
-
static bool ioe_rpmsg_server_match(FAR struct rpmsg_device *rdev,
FAR void *priv_,
FAR const char *name,
@@ -622,6 +615,11 @@ static bool ioe_rpmsg_server_match(FAR struct rpmsg_device
*rdev,
return !strcmp(name, eptname);
}
+static void ioe_rpmsg_server_ept_release(FAR struct rpmsg_endpoint *ept)
+{
+ kmm_free(ept);
+}
+
static void ioe_rpmsg_server_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_,
FAR const char *name,
@@ -637,9 +635,10 @@ static void ioe_rpmsg_server_bind(FAR struct rpmsg_device
*rdev,
}
ept->priv = priv;
+ ept->release_cb = ioe_rpmsg_server_ept_release;
rpmsg_create_ept(ept, rdev, name, RPMSG_ADDR_ANY, RPMSG_ADDR_ANY,
- ioe_rpmsg_server_ept_cb, ioe_rpmsg_server_unbind);
+ ioe_rpmsg_server_ept_cb, rpmsg_destroy_ept);
}
/****************************************************************************
diff --git a/drivers/misc/rpmsgblk_server.c b/drivers/misc/rpmsgblk_server.c
index 2638b04729..1ac7610b4d 100644
--- a/drivers/misc/rpmsgblk_server.c
+++ b/drivers/misc/rpmsgblk_server.c
@@ -82,7 +82,6 @@ static bool rpmsgblk_ns_match(FAR struct rpmsg_device *rdev,
static void rpmsgblk_ns_bind(FAR struct rpmsg_device *rdev,
FAR void *priv, FAR const char *name,
uint32_t dest);
-static void rpmsgblk_ns_unbind(FAR struct rpmsg_endpoint *ept);
static int rpmsgblk_ept_cb(FAR struct rpmsg_endpoint *ept,
FAR void *data, size_t len, uint32_t src,
FAR void *priv);
@@ -497,6 +496,18 @@ static bool rpmsgblk_ns_match(FAR struct rpmsg_device
*rdev,
return !strncmp(name, RPMSGBLK_NAME_PREFIX, RPMSGBLK_NAME_PREFIX_LEN);
}
+/****************************************************************************
+ * Name: rpmsgblk_ept_release
+ ****************************************************************************/
+
+static void rpmsgblk_ept_release(FAR struct rpmsg_endpoint *ept)
+{
+ FAR struct rpmsgblk_server_s *server = ept->priv;
+
+ inode_release(server->blknode);
+ kmm_free(server);
+}
+
/****************************************************************************
* Name: rpmsgblk_ns_bind
****************************************************************************/
@@ -526,11 +537,12 @@ static void rpmsgblk_ns_bind(FAR struct rpmsg_device
*rdev,
}
server->ept.priv = server;
+ server->ept.release_cb = rpmsgblk_ept_release;
server->bops = server->blknode->u.i_bops;
ret = rpmsg_create_ept(&server->ept, rdev, name,
RPMSG_ADDR_ANY, dest,
- rpmsgblk_ept_cb, rpmsgblk_ns_unbind);
+ rpmsgblk_ept_cb, rpmsg_destroy_ept);
if (ret < 0)
{
ferr("endpoint create failed, ret=%d\n", ret);
@@ -539,19 +551,6 @@ static void rpmsgblk_ns_bind(FAR struct rpmsg_device *rdev,
}
}
-/****************************************************************************
- * Name: rpmsgblk_ns_unbind
- ****************************************************************************/
-
-static void rpmsgblk_ns_unbind(FAR struct rpmsg_endpoint *ept)
-{
- FAR struct rpmsgblk_server_s *server = ept->priv;
-
- rpmsg_destroy_ept(&server->ept);
- inode_release(server->blknode);
- kmm_free(server);
-}
-
/****************************************************************************
* Name: rpmsgblk_ept_cb
****************************************************************************/
diff --git a/drivers/misc/rpmsgdev_server.c b/drivers/misc/rpmsgdev_server.c
index 8d596764a1..57bcc5a60a 100644
--- a/drivers/misc/rpmsgdev_server.c
+++ b/drivers/misc/rpmsgdev_server.c
@@ -112,7 +112,6 @@ static bool rpmsgdev_ns_match(FAR struct rpmsg_device *rdev,
static void rpmsgdev_ns_bind(FAR struct rpmsg_device *rdev,
FAR void *priv, FAR const char *name,
uint32_t dest);
-static void rpmsgdev_ns_unbind(FAR struct rpmsg_endpoint *ept);
static int rpmsgdev_ept_cb(FAR struct rpmsg_endpoint *ept,
FAR void *data, size_t len, uint32_t src,
FAR void *priv);
@@ -425,41 +424,10 @@ static bool rpmsgdev_ns_match(FAR struct rpmsg_device
*rdev,
}
/****************************************************************************
- * Name: rpmsgdev_ns_bind
- ****************************************************************************/
-
-static void rpmsgdev_ns_bind(FAR struct rpmsg_device *rdev,
- FAR void *priv, FAR const char *name,
- uint32_t dest)
-{
- FAR struct rpmsgdev_server_s *server;
- int ret;
-
- server = kmm_zalloc(sizeof(*server));
- if (server == NULL)
- {
- return;
- }
-
- list_initialize(&server->head);
- nxmutex_init(&server->lock);
- server->ept.priv = server;
-
- ret = rpmsg_create_ept(&server->ept, rdev, name,
- RPMSG_ADDR_ANY, dest,
- rpmsgdev_ept_cb, rpmsgdev_ns_unbind);
- if (ret < 0)
- {
- nxmutex_destroy(&server->lock);
- kmm_free(server);
- }
-}
-
-/****************************************************************************
- * Name: rpmsgdev_ns_unbind
+ * Name: rpmsgdev_ept_release
****************************************************************************/
-static void rpmsgdev_ns_unbind(FAR struct rpmsg_endpoint *ept)
+static void rpmsgdev_ept_release(FAR struct rpmsg_endpoint *ept)
{
FAR struct rpmsgdev_server_s *server = ept->priv;
FAR struct rpmsgdev_device_s *dev;
@@ -486,10 +454,41 @@ static void rpmsgdev_ns_unbind(FAR struct rpmsg_endpoint
*ept)
nxmutex_unlock(&server->lock);
- rpmsg_destroy_ept(&server->ept);
kmm_free(server);
}
+/****************************************************************************
+ * Name: rpmsgdev_ns_bind
+ ****************************************************************************/
+
+static void rpmsgdev_ns_bind(FAR struct rpmsg_device *rdev,
+ FAR void *priv, FAR const char *name,
+ uint32_t dest)
+{
+ FAR struct rpmsgdev_server_s *server;
+ int ret;
+
+ server = kmm_zalloc(sizeof(*server));
+ if (server == NULL)
+ {
+ return;
+ }
+
+ list_initialize(&server->head);
+ nxmutex_init(&server->lock);
+ server->ept.priv = server;
+ server->ept.release_cb = rpmsgdev_ept_release;
+
+ ret = rpmsg_create_ept(&server->ept, rdev, name,
+ RPMSG_ADDR_ANY, dest,
+ rpmsgdev_ept_cb, rpmsg_destroy_ept);
+ if (ret < 0)
+ {
+ nxmutex_destroy(&server->lock);
+ kmm_free(server);
+ }
+}
+
/****************************************************************************
* Name: rpmsgdev_ept_cb
****************************************************************************/
diff --git a/drivers/mtd/rpmsgmtd_server.c b/drivers/mtd/rpmsgmtd_server.c
index 9cfeb4dad8..7320c5d365 100644
--- a/drivers/mtd/rpmsgmtd_server.c
+++ b/drivers/mtd/rpmsgmtd_server.c
@@ -85,7 +85,6 @@ static bool rpmsgmtd_ns_match(FAR struct rpmsg_device *rdev,
static void rpmsgmtd_ns_bind(FAR struct rpmsg_device *rdev,
FAR void *priv, FAR const char *name,
uint32_t dest);
-static void rpmsgmtd_ns_unbind(FAR struct rpmsg_endpoint *ept);
static int rpmsgmtd_ept_cb(FAR struct rpmsg_endpoint *ept,
FAR void *data, size_t len, uint32_t src,
FAR void *priv);
@@ -352,6 +351,18 @@ static bool rpmsgmtd_ns_match(FAR struct rpmsg_device
*rdev,
return !strncmp(name, RPMSGMTD_NAME_PREFIX, RPMSGMTD_NAME_PREFIX_LEN);
}
+/****************************************************************************
+ * Name: rpmsgmtd_ept_release
+ ****************************************************************************/
+
+static void rpmsgmtd_ept_release(FAR struct rpmsg_endpoint *ept)
+{
+ FAR struct rpmsgmtd_server_s *server = ept->priv;
+
+ close_mtddriver(server->mtdnode);
+ kmm_free(server);
+}
+
/****************************************************************************
* Name: rpmsgmtd_ns_bind
****************************************************************************/
@@ -379,12 +390,13 @@ static void rpmsgmtd_ns_bind(FAR struct rpmsg_device
*rdev,
}
server->ept.priv = server;
+ server->ept.release_cb = rpmsgmtd_ept_release;
server->mtdnode = mtdnode;
server->dev = mtdnode->u.i_mtd;
ret = rpmsg_create_ept(&server->ept, rdev, name,
RPMSG_ADDR_ANY, dest,
- rpmsgmtd_ept_cb, rpmsgmtd_ns_unbind);
+ rpmsgmtd_ept_cb, rpmsg_destroy_ept);
if (ret < 0)
{
ferr("endpoint create failed, ret=%d\n", ret);
@@ -398,19 +410,6 @@ errout:
kmm_free(server);
}
-/****************************************************************************
- * Name: rpmsgmtd_ns_unbind
- ****************************************************************************/
-
-static void rpmsgmtd_ns_unbind(FAR struct rpmsg_endpoint *ept)
-{
- FAR struct rpmsgmtd_server_s *server = ept->priv;
-
- rpmsg_destroy_ept(&server->ept);
- close_mtddriver(server->mtdnode);
- kmm_free(server);
-}
-
/****************************************************************************
* Name: rpmsgmtd_ept_cb
****************************************************************************/
diff --git a/drivers/power/supply/regulator_rpmsg.c
b/drivers/power/supply/regulator_rpmsg.c
index 19de90bab5..7672eff8c3 100644
--- a/drivers/power/supply/regulator_rpmsg.c
+++ b/drivers/power/supply/regulator_rpmsg.c
@@ -135,7 +135,6 @@ static void regulator_rpmsg_client_created(struct
rpmsg_device *rdev,
static void regulator_rpmsg_client_destroy(struct rpmsg_device *rdev,
FAR void *priv);
-static void regulator_rpmsg_server_unbind(FAR struct rpmsg_endpoint *ept);
static bool regulator_rpmsg_server_match(FAR struct rpmsg_device *rdev,
FAR void *priv,
FAR const char *name,
@@ -330,7 +329,16 @@ static void regulator_rpmsg_client_destroy(struct
rpmsg_device *rdev,
}
}
-static void regulator_rpmsg_server_unbind(FAR struct rpmsg_endpoint *ept)
+static bool regulator_rpmsg_server_match(FAR struct rpmsg_device *rdev,
+ FAR void *priv,
+ FAR const char *name,
+ uint32_t dest)
+{
+ return strcmp(name, REGULATOR_RPMSG_EPT_NAME) == 0;
+}
+
+static void
+regulator_rpmsg_server_ept_release(FAR struct rpmsg_endpoint *ept)
{
FAR struct regulator_rpmsg_server_s *server = ept->priv;
FAR struct regulator_rpmsg_s *reg;
@@ -350,18 +358,9 @@ static void regulator_rpmsg_server_unbind(FAR struct
rpmsg_endpoint *ept)
}
nxmutex_destroy(&server->lock);
- rpmsg_destroy_ept(ept);
kmm_free(server);
}
-static bool regulator_rpmsg_server_match(FAR struct rpmsg_device *rdev,
- FAR void *priv,
- FAR const char *name,
- uint32_t dest)
-{
- return strcmp(name, REGULATOR_RPMSG_EPT_NAME) == 0;
-}
-
static void regulator_rpmsg_server_bind(FAR struct rpmsg_device *rdev,
FAR void *priv,
FAR const char *name,
@@ -376,13 +375,14 @@ static void regulator_rpmsg_server_bind(FAR struct
rpmsg_device *rdev,
}
server->ept.priv = server;
+ server->ept.release_cb = regulator_rpmsg_server_ept_release;
nxmutex_init(&server->lock);
list_initialize(&server->regulator_list);
rpmsg_create_ept(&server->ept, rdev, name,
RPMSG_ADDR_ANY, RPMSG_ADDR_ANY,
regulator_rpmsg_ept_cb,
- regulator_rpmsg_server_unbind);
+ rpmsg_destroy_ept);
}
static int regulator_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept,
diff --git a/drivers/reset/reset_rpmsg.c b/drivers/reset/reset_rpmsg.c
index 4d18ea1c06..c13358450c 100644
--- a/drivers/reset/reset_rpmsg.c
+++ b/drivers/reset/reset_rpmsg.c
@@ -678,7 +678,16 @@ static int reset_rpmsg_ept_cb(FAR struct rpmsg_endpoint
*ept,
return ret;
}
-static void reset_rpmsg_server_unbind(FAR struct rpmsg_endpoint *ept)
+static bool reset_rpmsg_server_match(FAR struct rpmsg_device *rdev,
+ FAR void *priv,
+ FAR const char *name,
+ uint32_t dest)
+{
+ return strcmp(name, RESET_RPMSG_EPT_NAME) == 0;
+}
+
+static void reset_rpmsg_server_ept_release(FAR struct rpmsg_endpoint *ept,
+ FAR void *priv)
{
FAR struct reset_rpmsg_server_s *server = ept->priv;
FAR struct reset_rpmsg_s *reset;
@@ -692,19 +701,10 @@ static void reset_rpmsg_server_unbind(FAR struct
rpmsg_endpoint *ept)
kmm_free(reset);
}
- rpmsg_destroy_ept(ept);
nxmutex_destroy(&server->lock);
kmm_free(server);
}
-static bool reset_rpmsg_server_match(FAR struct rpmsg_device *rdev,
- FAR void *priv,
- FAR const char *name,
- uint32_t dest)
-{
- return strcmp(name, RESET_RPMSG_EPT_NAME) == 0;
-}
-
static void reset_rpmsg_server_bind(FAR struct rpmsg_device *rdev,
FAR void *priv,
FAR const char *name,
@@ -719,13 +719,14 @@ static void reset_rpmsg_server_bind(FAR struct
rpmsg_device *rdev,
}
server->ept.priv = server;
+ server->ept.release_cb = reset_rpmsg_server_ept_release;
list_initialize(&server->list);
nxmutex_init(&server->lock);
rpmsg_create_ept(&server->ept, rdev, name,
RPMSG_ADDR_ANY, RPMSG_ADDR_ANY,
reset_rpmsg_ept_cb,
- reset_rpmsg_server_unbind);
+ rpmsg_destroy_ept);
}
/****************************************************************************
diff --git a/drivers/sensors/sensor_rpmsg.c b/drivers/sensors/sensor_rpmsg.c
index 24f41bbc0c..1a9e97791b 100644
--- a/drivers/sensors/sensor_rpmsg.c
+++ b/drivers/sensors/sensor_rpmsg.c
@@ -1311,7 +1311,41 @@ static int sensor_rpmsg_ept_cb(FAR struct rpmsg_endpoint
*ept,
return -EINVAL;
}
-static void sensor_rpmsg_ns_unbind_cb(FAR struct rpmsg_endpoint *ept)
+static void sensor_rpmsg_device_ns_bound(FAR struct rpmsg_endpoint *ept)
+{
+ FAR struct sensor_rpmsg_ept_s *sre;
+ FAR struct sensor_rpmsg_dev_s *dev;
+
+ sre = container_of(ept, struct sensor_rpmsg_ept_s, ept);
+
+ nxrmutex_lock(&g_ept_lock);
+ list_add_tail(&g_eptlist, &sre->node);
+ nxrmutex_unlock(&g_ept_lock);
+
+ /* Broadcast all device to ready ept */
+
+ nxrmutex_lock(&g_dev_lock);
+ list_for_every_entry(&g_devlist, dev,
+ struct sensor_rpmsg_dev_s, node)
+ {
+ sensor_rpmsg_lock(dev);
+ if (dev->nadvertisers > 0)
+ {
+ sensor_rpmsg_advsub_one(dev, ept, SENSOR_RPMSG_ADVERTISE);
+ }
+
+ if (dev->nsubscribers > 0)
+ {
+ sensor_rpmsg_advsub_one(dev, ept, SENSOR_RPMSG_SUBSCRIBE);
+ }
+
+ sensor_rpmsg_unlock(dev);
+ }
+
+ nxrmutex_unlock(&g_dev_lock);
+}
+
+static void sensor_rpmsg_ept_release(FAR struct rpmsg_endpoint *ept)
{
FAR struct sensor_rpmsg_ept_s *sre;
FAR struct sensor_rpmsg_dev_s *dev;
@@ -1363,44 +1397,9 @@ static void sensor_rpmsg_ns_unbind_cb(FAR struct
rpmsg_endpoint *ept)
nxrmutex_unlock(&g_ept_lock);
nxrmutex_destroy(&sre->lock);
- rpmsg_destroy_ept(ept);
kmm_free(sre);
}
-static void sensor_rpmsg_device_ns_bound(FAR struct rpmsg_endpoint *ept)
-{
- FAR struct sensor_rpmsg_ept_s *sre;
- FAR struct sensor_rpmsg_dev_s *dev;
-
- sre = container_of(ept, struct sensor_rpmsg_ept_s, ept);
-
- nxrmutex_lock(&g_ept_lock);
- list_add_tail(&g_eptlist, &sre->node);
- nxrmutex_unlock(&g_ept_lock);
-
- /* Broadcast all device to ready ept */
-
- nxrmutex_lock(&g_dev_lock);
- list_for_every_entry(&g_devlist, dev,
- struct sensor_rpmsg_dev_s, node)
- {
- sensor_rpmsg_lock(dev);
- if (dev->nadvertisers > 0)
- {
- sensor_rpmsg_advsub_one(dev, ept, SENSOR_RPMSG_ADVERTISE);
- }
-
- if (dev->nsubscribers > 0)
- {
- sensor_rpmsg_advsub_one(dev, ept, SENSOR_RPMSG_SUBSCRIBE);
- }
-
- sensor_rpmsg_unlock(dev);
- }
-
- nxrmutex_unlock(&g_dev_lock);
-}
-
static void sensor_rpmsg_device_created(FAR struct rpmsg_device *rdev,
FAR void *priv)
{
@@ -1416,10 +1415,12 @@ static void sensor_rpmsg_device_created(FAR struct
rpmsg_device *rdev,
sre->ept.priv = sre;
nxrmutex_init(&sre->lock);
sre->ept.ns_bound_cb = sensor_rpmsg_device_ns_bound;
+ sre->ept.release_cb = sensor_rpmsg_ept_release;
+
if (rpmsg_create_ept(&sre->ept, rdev, SENSOR_RPMSG_EPT_NAME,
RPMSG_ADDR_ANY, RPMSG_ADDR_ANY,
sensor_rpmsg_ept_cb,
- sensor_rpmsg_ns_unbind_cb) < 0)
+ rpmsg_destroy_ept) < 0)
{
nxrmutex_destroy(&sre->lock);
kmm_free(sre);
diff --git a/drivers/syslog/syslog_rpmsg_server.c
b/drivers/syslog/syslog_rpmsg_server.c
index 79619a9135..d171a61671 100644
--- a/drivers/syslog/syslog_rpmsg_server.c
+++ b/drivers/syslog/syslog_rpmsg_server.c
@@ -69,7 +69,6 @@ static bool syslog_rpmsg_ns_match(FAR struct rpmsg_device
*rdev,
static void syslog_rpmsg_ns_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_, FAR const char *name,
uint32_t dest);
-static void syslog_rpmsg_ns_unbind(FAR struct rpmsg_endpoint *ept);
static int syslog_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept,
FAR void *data, size_t len, uint32_t src,
FAR void *priv_);
@@ -171,6 +170,25 @@ static bool syslog_rpmsg_ns_match(FAR struct rpmsg_device
*rdev,
return !strcmp(name, SYSLOG_RPMSG_EPT_NAME);
}
+static void syslog_rpmsg_ept_release(FAR struct rpmsg_endpoint *ept)
+{
+ FAR struct syslog_rpmsg_server_s *priv = ept->priv;
+
+ if (priv->nextpos)
+ {
+ syslog_rpmsg_write(priv->tmpbuf, priv->nextpos, "\n", 1);
+ }
+
+#ifdef CONFIG_SYSLOG_RPMSG_SERVER_CHARDEV
+ nxmutex_lock(&g_lock);
+ list_delete(&priv->node);
+ nxmutex_unlock(&g_lock);
+#endif
+
+ kmm_free(priv->tmpbuf);
+ kmm_free(priv);
+}
+
static void syslog_rpmsg_ns_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_, FAR const char *name,
uint32_t dest)
@@ -185,6 +203,7 @@ static void syslog_rpmsg_ns_bind(FAR struct rpmsg_device
*rdev,
}
priv->ept.priv = priv;
+ priv->ept.release_cb = syslog_rpmsg_ept_release;
#ifdef CONFIG_SYSLOG_RPMSG_SERVER_CHARDEV
nxmutex_lock(&g_lock);
@@ -194,34 +213,13 @@ static void syslog_rpmsg_ns_bind(FAR struct rpmsg_device
*rdev,
ret = rpmsg_create_ept(&priv->ept, rdev, SYSLOG_RPMSG_EPT_NAME,
RPMSG_ADDR_ANY, dest,
- syslog_rpmsg_ept_cb, syslog_rpmsg_ns_unbind);
+ syslog_rpmsg_ept_cb, rpmsg_destroy_ept);
if (ret)
{
kmm_free(priv);
}
}
-static void syslog_rpmsg_ns_unbind(FAR struct rpmsg_endpoint *ept)
-{
- FAR struct syslog_rpmsg_server_s *priv = ept->priv;
-
- if (priv->nextpos)
- {
- syslog_rpmsg_write(priv->tmpbuf, priv->nextpos, "\n", 1);
- }
-
- rpmsg_destroy_ept(ept);
-
-#ifdef CONFIG_SYSLOG_RPMSG_SERVER_CHARDEV
- nxmutex_lock(&g_lock);
- list_delete(&priv->node);
- nxmutex_unlock(&g_lock);
-#endif
-
- kmm_free(priv->tmpbuf);
- kmm_free(priv);
-}
-
static int syslog_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept,
FAR void *data, size_t len,
uint32_t src, FAR void *priv_)
diff --git a/drivers/timers/rpmsg_rtc.c b/drivers/timers/rpmsg_rtc.c
index 477adc0236..f224b6b353 100644
--- a/drivers/timers/rpmsg_rtc.c
+++ b/drivers/timers/rpmsg_rtc.c
@@ -620,19 +620,6 @@ static int rpmsg_rtc_server_destroy(FAR struct
rtc_lowerhalf_s *lower)
}
#endif
-static void rpmsg_rtc_server_ns_unbind(FAR struct rpmsg_endpoint *ept)
-{
- FAR struct rpmsg_rtc_client_s *client = container_of(ept,
- struct rpmsg_rtc_client_s, ept);
- FAR struct rpmsg_rtc_server_s *server = ept->priv;
-
- nxmutex_lock(&server->lock);
- list_delete(&client->node);
- nxmutex_unlock(&server->lock);
- rpmsg_destroy_ept(&client->ept);
- kmm_free(client);
-}
-
#ifdef CONFIG_RTC_ALARM
static void rpmsg_rtc_server_alarm_cb(FAR void *priv, int alarmid)
{
@@ -720,6 +707,18 @@ static bool rpmsg_rtc_server_ns_match(FAR struct
rpmsg_device *rdev,
return !strcmp(name, RPMSG_RTC_EPT_NAME);
}
+static void rpmsg_rtc_server_ept_release(FAR struct rpmsg_endpoint *ept)
+{
+ FAR struct rpmsg_rtc_client_s *client = container_of(ept,
+ struct rpmsg_rtc_client_s, ept);
+ FAR struct rpmsg_rtc_server_s *server = ept->priv;
+
+ nxmutex_lock(&server->lock);
+ list_delete(&client->node);
+ nxmutex_unlock(&server->lock);
+ kmm_free(client);
+}
+
static void rpmsg_rtc_server_ns_bind(FAR struct rpmsg_device *rdev,
FAR void *priv,
FAR const char *name,
@@ -737,10 +736,12 @@ static void rpmsg_rtc_server_ns_bind(FAR struct
rpmsg_device *rdev,
}
client->ept.priv = server;
+ client->ept.release_cb = rpmsg_rtc_server_ept_release;
+
if (rpmsg_create_ept(&client->ept, rdev, RPMSG_RTC_EPT_NAME,
RPMSG_ADDR_ANY, dest,
rpmsg_rtc_server_ept_cb,
- rpmsg_rtc_server_ns_unbind) < 0)
+ rpmsg_destroy_ept) < 0)
{
kmm_free(client);
return;
diff --git a/drivers/usrsock/usrsock_rpmsg_server.c
b/drivers/usrsock/usrsock_rpmsg_server.c
index 97c50e3181..7ea3e6d477 100644
--- a/drivers/usrsock/usrsock_rpmsg_server.c
+++ b/drivers/usrsock/usrsock_rpmsg_server.c
@@ -153,7 +153,6 @@ static bool usrsock_rpmsg_ns_match(FAR struct rpmsg_device
*rdev,
static void usrsock_rpmsg_ns_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_, FAR const char *name,
uint32_t dest);
-static void usrsock_rpmsg_ns_unbind(FAR struct rpmsg_endpoint *ept);
static int usrsock_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept,
FAR void *data, size_t len, uint32_t src,
FAR void *priv);
@@ -1019,6 +1018,35 @@ static bool usrsock_rpmsg_ns_match(FAR struct
rpmsg_device *rdev,
return !strcmp(name, USRSOCK_RPMSG_EPT_NAME);
}
+static void usrsock_rpmsg_ept_release(FAR struct rpmsg_endpoint *ept)
+{
+ FAR struct usrsock_rpmsg_s *priv = ept->priv;
+ int i;
+
+#ifdef CONFIG_NETDB_DNSCLIENT
+ dns_unregister_notify(usrsock_rpmsg_send_dns_event, ept);
+#endif
+
+ /* Collect all socks belong to the dead client */
+
+ for (i = 0; i < CONFIG_NET_USRSOCK_RPMSG_SERVER_NSOCKS; i++)
+ {
+ if (priv->epts[i] == ept)
+ {
+ usrsock_rpmsg_poll_setup(&priv->pfds[i], 0);
+
+ /* It's safe to close socks here */
+
+ psock_close(&priv->socks[i]);
+ nxrmutex_lock(&priv->mutex);
+ priv->epts[i] = NULL;
+ nxrmutex_unlock(&priv->mutex);
+ }
+ }
+
+ kmm_free(ept);
+}
+
static void usrsock_rpmsg_ns_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_, FAR const char *name,
uint32_t dest)
@@ -1035,6 +1063,7 @@ static void usrsock_rpmsg_ns_bind(FAR struct rpmsg_device
*rdev,
}
uept->ept.priv = priv;
+ uept->ept.release_cb = usrsock_rpmsg_ept_release;
for (i = 0; i < CONFIG_NET_USRSOCK_RPMSG_SERVER_NIOVEC; i++)
{
sq_addlast(&uept->reqs[i].flink, &uept->req_free);
@@ -1042,7 +1071,7 @@ static void usrsock_rpmsg_ns_bind(FAR struct rpmsg_device
*rdev,
ret = rpmsg_create_ept(&uept->ept, rdev, USRSOCK_RPMSG_EPT_NAME,
RPMSG_ADDR_ANY, dest,
- usrsock_rpmsg_ept_cb, usrsock_rpmsg_ns_unbind);
+ usrsock_rpmsg_ept_cb, rpmsg_destroy_ept);
if (ret < 0)
{
kmm_free(uept);
@@ -1054,36 +1083,6 @@ static void usrsock_rpmsg_ns_bind(FAR struct
rpmsg_device *rdev,
#endif
}
-static void usrsock_rpmsg_ns_unbind(FAR struct rpmsg_endpoint *ept)
-{
- FAR struct usrsock_rpmsg_s *priv = ept->priv;
- int i;
-
-#ifdef CONFIG_NETDB_DNSCLIENT
- dns_unregister_notify(usrsock_rpmsg_send_dns_event, ept);
-#endif
-
- /* Collect all socks belong to the dead client */
-
- for (i = 0; i < CONFIG_NET_USRSOCK_RPMSG_SERVER_NSOCKS; i++)
- {
- if (priv->epts[i] == ept)
- {
- usrsock_rpmsg_poll_setup(&priv->pfds[i], 0);
-
- /* It's safe to close socks here */
-
- psock_close(&priv->socks[i]);
- nxrmutex_lock(&priv->mutex);
- priv->epts[i] = NULL;
- nxrmutex_unlock(&priv->mutex);
- }
- }
-
- rpmsg_destroy_ept(ept);
- kmm_free(ept);
-}
-
static int usrsock_rpmsg_ept_do_cb(FAR struct usrsock_rpmsg_ept_s *uept,
FAR void *data, size_t len, uint32_t src,
FAR struct usrsock_rpmsg_s *priv)
diff --git a/drivers/wireless/bluetooth/bt_rpmsghci_server.c
b/drivers/wireless/bluetooth/bt_rpmsghci_server.c
index 56eab7d7ff..c7cde082f4 100644
--- a/drivers/wireless/bluetooth/bt_rpmsghci_server.c
+++ b/drivers/wireless/bluetooth/bt_rpmsghci_server.c
@@ -399,17 +399,18 @@ static int rpmsghci_ept_cb(FAR struct rpmsg_endpoint
*ept, FAR void *data,
}
/****************************************************************************
- * Name: rpmsghci_ns_unbind
+ * Name: rpmsghci_ept_release
*
* Description:
- * Unbind from the rpmsg name service.
+ * Release the rpmsg endpoint.
*
****************************************************************************/
-static void rpmsghci_ns_unbind(FAR struct rpmsg_endpoint *ept)
+static void rpmsghci_ept_release(FAR struct rpmsg_endpoint *ept)
{
- rpmsg_destroy_ept(ept);
- kmm_free(ept);
+ FAR struct rpmsghci_server_s *server = ept->priv;
+
+ kmm_free(server);
}
/****************************************************************************
@@ -426,9 +427,11 @@ static void rpmsghci_ns_bind(FAR struct rpmsg_device
*rdev, FAR void *priv,
FAR struct rpmsghci_server_s *server = priv;
server->ept.priv = priv;
+ server->ept.release_cb = rpmsghci_ept_release;
+
rpmsg_create_ept(&server->ept, rdev, name,
RPMSG_ADDR_ANY, dest,
- rpmsghci_ept_cb, rpmsghci_ns_unbind);
+ rpmsghci_ept_cb, rpmsg_destroy_ept);
}
/****************************************************************************
diff --git a/fs/rpmsgfs/rpmsgfs_server.c b/fs/rpmsgfs/rpmsgfs_server.c
index b3f8fbd8a8..8e3e065ed6 100644
--- a/fs/rpmsgfs/rpmsgfs_server.c
+++ b/fs/rpmsgfs/rpmsgfs_server.c
@@ -131,7 +131,6 @@ static bool rpmsgfs_ns_match(FAR struct rpmsg_device *rdev,
static void rpmsgfs_ns_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_, FAR const char *name,
uint32_t dest);
-static void rpmsgfs_ns_unbind(FAR struct rpmsg_endpoint *ept);
static int rpmsgfs_ept_cb(FAR struct rpmsg_endpoint *ept,
FAR void *data, size_t len, uint32_t src,
FAR void *priv);
@@ -888,33 +887,7 @@ static bool rpmsgfs_ns_match(FAR struct rpmsg_device *rdev,
return !strncmp(name, RPMSGFS_NAME_PREFIX, strlen(RPMSGFS_NAME_PREFIX));
}
-static void rpmsgfs_ns_bind(FAR struct rpmsg_device *rdev,
- FAR void *priv_, FAR const char *name,
- uint32_t dest)
-{
- FAR struct rpmsgfs_server_s *priv;
- int ret;
-
- priv = fs_heap_zalloc(sizeof(*priv));
- if (!priv)
- {
- return;
- }
-
- priv->ept.priv = priv;
- nxmutex_init(&priv->lock);
-
- ret = rpmsg_create_ept(&priv->ept, rdev, name,
- RPMSG_ADDR_ANY, dest,
- rpmsgfs_ept_cb, rpmsgfs_ns_unbind);
- if (ret)
- {
- nxmutex_destroy(&priv->lock);
- fs_heap_free(priv);
- }
-}
-
-static void rpmsgfs_ns_unbind(FAR struct rpmsg_endpoint *ept)
+static void rpmsgfs_ept_release(FAR struct rpmsg_endpoint *ept)
{
FAR struct rpmsgfs_server_s *priv = ept->priv;
int i;
@@ -941,7 +914,6 @@ static void rpmsgfs_ns_unbind(FAR struct rpmsg_endpoint
*ept)
}
}
- rpmsg_destroy_ept(&priv->ept);
nxmutex_destroy(&priv->lock);
fs_heap_free(priv->files);
@@ -949,6 +921,33 @@ static void rpmsgfs_ns_unbind(FAR struct rpmsg_endpoint
*ept)
fs_heap_free(priv);
}
+static void rpmsgfs_ns_bind(FAR struct rpmsg_device *rdev,
+ FAR void *priv_, FAR const char *name,
+ uint32_t dest)
+{
+ FAR struct rpmsgfs_server_s *priv;
+ int ret;
+
+ priv = fs_heap_zalloc(sizeof(*priv));
+ if (!priv)
+ {
+ return;
+ }
+
+ priv->ept.priv = priv;
+ priv->ept.release_cb = rpmsgfs_ept_release;
+ nxmutex_init(&priv->lock);
+
+ ret = rpmsg_create_ept(&priv->ept, rdev, name,
+ RPMSG_ADDR_ANY, dest,
+ rpmsgfs_ept_cb, rpmsg_destroy_ept);
+ if (ret)
+ {
+ nxmutex_destroy(&priv->lock);
+ fs_heap_free(priv);
+ }
+}
+
static int rpmsgfs_ept_cb(FAR struct rpmsg_endpoint *ept,
FAR void *data, size_t len, uint32_t src,
FAR void *priv)