aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorJens Wiklander <jens.wiklander@linaro.org>2021-10-27 18:00:22 +0200
committerJérôme Forissier <jerome@forissier.org>2021-11-04 10:11:50 +0100
commite9907fd739e0b46e0f62f571a36ceaee44fc55f3 (patch)
treee573bf3c4c798374ae1e1374bf7ce5b5440548d3 /core
parent16dfecc2a143d08f2b271cbf3eadeb68d6dfeca5 (diff)
core: pta: socket: enable TA to query recv out buffer
Propagate out size for socket recv event when it's larger than the supplied in size. Also enable passing a NULL buffer while querying the size of the buffer. Reviewed-by: Etienne Carriere <etienne.carriere@linaro.org> Reviewed-by: Jerome Forissier <jerome@forissier.org> Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
Diffstat (limited to 'core')
-rw-r--r--core/tee/socket.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/core/tee/socket.c b/core/tee/socket.c
index b5672cf4..d79401c0 100644
--- a/core/tee/socket.c
+++ b/core/tee/socket.c
@@ -122,9 +122,9 @@ static TEE_Result socket_send(uint32_t instance_id, uint32_t param_types,
static TEE_Result socket_recv(uint32_t instance_id, uint32_t param_types,
TEE_Param params[TEE_NUM_PARAMS])
{
- struct mobj *mobj;
- TEE_Result res;
- void *va;
+ struct mobj *mobj = NULL;
+ TEE_Result res = TEE_SUCCESS;
+ void *va = NULL;
uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
TEE_PARAM_TYPE_MEMREF_OUTPUT,
TEE_PARAM_TYPE_NONE,
@@ -136,11 +136,13 @@ static TEE_Result socket_recv(uint32_t instance_id, uint32_t param_types,
return TEE_ERROR_BAD_PARAMETERS;
}
- va = thread_rpc_shm_cache_alloc(THREAD_SHM_CACHE_USER_SOCKET,
- THREAD_SHM_TYPE_APPLICATION,
- params[1].memref.size, &mobj);
- if (!va)
- return TEE_ERROR_OUT_OF_MEMORY;
+ if (params[1].memref.size) {
+ va = thread_rpc_shm_cache_alloc(THREAD_SHM_CACHE_USER_SOCKET,
+ THREAD_SHM_TYPE_APPLICATION,
+ params[1].memref.size, &mobj);
+ if (!va)
+ return TEE_ERROR_OUT_OF_MEMORY;
+ }
struct thread_param tpm[3] = {
[0] = THREAD_PARAM_VALUE(IN, OPTEE_RPC_SOCKET_RECV, instance_id,
@@ -152,11 +154,10 @@ static TEE_Result socket_recv(uint32_t instance_id, uint32_t param_types,
res = thread_rpc_cmd(OPTEE_RPC_CMD_SOCKET, 3, tpm);
- if (tpm[1].u.memref.size > params[1].memref.size)
- return TEE_ERROR_GENERIC;
- params[1].memref.size = tpm[1].u.memref.size;
if (params[1].memref.size)
- memcpy(params[1].memref.buffer, va, params[1].memref.size);
+ memcpy(params[1].memref.buffer, va,
+ MIN(params[1].memref.size, tpm[1].u.memref.size));
+ params[1].memref.size = tpm[1].u.memref.size;
return res;
}