diff --git a/lib/include/openamp/rpmsg_rpc_client_server.h b/lib/include/openamp/rpmsg_rpc_client_server.h index a344cde..0d32974 100644 --- a/lib/include/openamp/rpmsg_rpc_client_server.h +++ b/lib/include/openamp/rpmsg_rpc_client_server.h @@ -176,7 +176,8 @@ int rpmsg_rpc_server_init(struct rpmsg_rpc_svr *rpcs, struct rpmsg_device *rdev, * data * @param rpc_id Function id * @param request_param Pointer to request buffer - * @param req_param_size Length of the request data + * @param req_param_size Length of the request data; must not exceed + * MAX_BUF_LEN - MAX_FUNC_ID_LEN * * @return Length of the received response, negative value for failure. */ diff --git a/lib/service/rpmsg/rpc/rpmsg_rpc_client.c b/lib/service/rpmsg/rpc/rpmsg_rpc_client.c index e5cb1ef..94af6f1 100644 --- a/lib/service/rpmsg/rpc/rpmsg_rpc_client.c +++ b/lib/service/rpmsg/rpc/rpmsg_rpc_client.c @@ -53,12 +53,16 @@ int rpmsg_rpc_client_send(struct rpmsg_rpc_clt *rpc, { unsigned char tmpbuf[MAX_BUF_LEN]; - if (!rpc) + if (!rpc || (!request_param && req_param_size != 0)) + return -EINVAL; + /* Reserve space for the function ID before copying parameters. */ + if (req_param_size > MAX_BUF_LEN - MAX_FUNC_ID_LEN) return -EINVAL; /* to optimize with the zero copy API */ memcpy(tmpbuf, &rpc_id, MAX_FUNC_ID_LEN); - memcpy(&tmpbuf[MAX_FUNC_ID_LEN], request_param, req_param_size); + if (req_param_size != 0) + memcpy(&tmpbuf[MAX_FUNC_ID_LEN], request_param, req_param_size); return rpmsg_send(&rpc->ept, tmpbuf, MAX_FUNC_ID_LEN + req_param_size); }