diff options
author | Jens Wiklander <jens.wiklander@linaro.org> | 2021-10-27 18:00:22 +0200 |
---|---|---|
committer | Jérôme Forissier <jerome@forissier.org> | 2021-11-04 10:11:50 +0100 |
commit | e9907fd739e0b46e0f62f571a36ceaee44fc55f3 (patch) | |
tree | e573bf3c4c798374ae1e1374bf7ce5b5440548d3 /core | |
parent | 16dfecc2a143d08f2b271cbf3eadeb68d6dfeca5 (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.c | 25 |
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; } |