Skip to content

Commit f5f6892

Browse files
fs: rpmsgfs_client: process host message as ns_announcement
Threat unsolicited messages from the host as ns_announcement messages. It unlocks the client flow by calling rpmsg_post() on the semaphore. Without this or an NS announcement, the client's semaphore will wait forever. This is practical when the server side is running from linux userspace using ioctl where controlling NS announcements is problematic. Signed-off-by: Andre Heinemans <andre.heinemans@nxp.com>
1 parent 439ec6c commit f5f6892

1 file changed

Lines changed: 14 additions & 3 deletions

File tree

fs/rpmsgfs/rpmsgfs_client.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ struct rpmsgfs_s
4949
struct rpmsg_endpoint ept;
5050
char cpuname[RPMSG_NAME_SIZE];
5151
sem_t wait;
52+
bool connected;
5253
};
5354

5455
struct rpmsgfs_cookie_s
@@ -291,10 +292,14 @@ static FAR void *rpmsgfs_get_tx_payload_buffer(FAR struct rpmsgfs_s *priv,
291292
return rpmsg_get_tx_payload_buffer(&priv->ept, len, true);
292293
}
293294

294-
static void rpmsgfs_ns_bound(struct rpmsg_endpoint *ept)
295+
static void rpmsgfs_set_connected(struct rpmsg_endpoint *ept)
295296
{
296297
FAR struct rpmsgfs_s *priv = ept->priv;
297-
rpmsg_post(&priv->ept, &priv->wait);
298+
if (!priv->connected)
299+
{
300+
priv->connected = true;
301+
rpmsg_post(&priv->ept, &priv->wait);
302+
}
298303
}
299304

300305
static void rpmsgfs_device_created(FAR struct rpmsg_device *rdev,
@@ -306,7 +311,7 @@ static void rpmsgfs_device_created(FAR struct rpmsg_device *rdev,
306311
if (strcmp(priv->cpuname, rpmsg_get_cpuname(rdev)) == 0)
307312
{
308313
priv->ept.priv = priv;
309-
priv->ept.ns_bound_cb = rpmsgfs_ns_bound;
314+
priv->ept.ns_bound_cb = rpmsgfs_set_connected;
310315
snprintf(buf, sizeof(buf), "%s%p", RPMSGFS_NAME_PREFIX, priv);
311316
rpmsg_create_ept(&priv->ept, rdev, buf,
312317
RPMSG_ADDR_ANY, RPMSG_ADDR_ANY,
@@ -329,9 +334,15 @@ static int rpmsgfs_ept_cb(FAR struct rpmsg_endpoint *ept,
329334
FAR void *data, size_t len, uint32_t src,
330335
FAR void *priv)
331336
{
337+
FAR struct rpmsgfs_s *ept_priv = ept->priv;
332338
FAR struct rpmsgfs_header_s *header = data;
333339
uint32_t command = header->command;
334340

341+
if (!ept_priv->connected)
342+
{
343+
rpmsgfs_set_connected(ept);
344+
}
345+
335346
if (command < nitems(g_rpmsgfs_handler))
336347
{
337348
return g_rpmsgfs_handler[command](ept, data, len, src, priv);

0 commit comments

Comments
 (0)