mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 02:24:24 +02:00
tee: refactor params_from_user()
Break out the memref handling into a separate helper function. No change in behavior. Reviewed-by: Sumit Garg <sumit.garg@oss.qualcomm.com> Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
This commit is contained in:
parent
c924c65f52
commit
fdf631ac9e
|
|
@ -354,6 +354,55 @@ tee_ioctl_shm_register(struct tee_context *ctx,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int param_from_user_memref(struct tee_context *ctx,
|
||||
struct tee_param_memref *memref,
|
||||
struct tee_ioctl_param *ip)
|
||||
{
|
||||
struct tee_shm *shm;
|
||||
|
||||
/*
|
||||
* If a NULL pointer is passed to a TA in the TEE,
|
||||
* the ip.c IOCTL parameters is set to TEE_MEMREF_NULL
|
||||
* indicating a NULL memory reference.
|
||||
*/
|
||||
if (ip->c != TEE_MEMREF_NULL) {
|
||||
/*
|
||||
* If we fail to get a pointer to a shared
|
||||
* memory object (and increase the ref count)
|
||||
* from an identifier we return an error. All
|
||||
* pointers that has been added in params have
|
||||
* an increased ref count. It's the callers
|
||||
* responibility to do tee_shm_put() on all
|
||||
* resolved pointers.
|
||||
*/
|
||||
shm = tee_shm_get_from_id(ctx, ip->c);
|
||||
if (IS_ERR(shm))
|
||||
return PTR_ERR(shm);
|
||||
|
||||
/*
|
||||
* Ensure offset + size does not overflow
|
||||
* offset and does not overflow the size of
|
||||
* the referred shared memory object.
|
||||
*/
|
||||
if ((ip->a + ip->b) < ip->a ||
|
||||
(ip->a + ip->b) > shm->size) {
|
||||
tee_shm_put(shm);
|
||||
return -EINVAL;
|
||||
}
|
||||
} else if (ctx->cap_memref_null) {
|
||||
/* Pass NULL pointer to OP-TEE */
|
||||
shm = NULL;
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
memref->shm_offs = ip->a;
|
||||
memref->size = ip->b;
|
||||
memref->shm = shm;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int params_from_user(struct tee_context *ctx, struct tee_param *params,
|
||||
size_t num_params,
|
||||
struct tee_ioctl_param __user *uparams)
|
||||
|
|
@ -361,8 +410,8 @@ static int params_from_user(struct tee_context *ctx, struct tee_param *params,
|
|||
size_t n;
|
||||
|
||||
for (n = 0; n < num_params; n++) {
|
||||
struct tee_shm *shm;
|
||||
struct tee_ioctl_param ip;
|
||||
int rc;
|
||||
|
||||
if (copy_from_user(&ip, uparams + n, sizeof(ip)))
|
||||
return -EFAULT;
|
||||
|
|
@ -385,45 +434,10 @@ static int params_from_user(struct tee_context *ctx, struct tee_param *params,
|
|||
case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT:
|
||||
case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_OUTPUT:
|
||||
case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INOUT:
|
||||
/*
|
||||
* If a NULL pointer is passed to a TA in the TEE,
|
||||
* the ip.c IOCTL parameters is set to TEE_MEMREF_NULL
|
||||
* indicating a NULL memory reference.
|
||||
*/
|
||||
if (ip.c != TEE_MEMREF_NULL) {
|
||||
/*
|
||||
* If we fail to get a pointer to a shared
|
||||
* memory object (and increase the ref count)
|
||||
* from an identifier we return an error. All
|
||||
* pointers that has been added in params have
|
||||
* an increased ref count. It's the callers
|
||||
* responibility to do tee_shm_put() on all
|
||||
* resolved pointers.
|
||||
*/
|
||||
shm = tee_shm_get_from_id(ctx, ip.c);
|
||||
if (IS_ERR(shm))
|
||||
return PTR_ERR(shm);
|
||||
|
||||
/*
|
||||
* Ensure offset + size does not overflow
|
||||
* offset and does not overflow the size of
|
||||
* the referred shared memory object.
|
||||
*/
|
||||
if ((ip.a + ip.b) < ip.a ||
|
||||
(ip.a + ip.b) > shm->size) {
|
||||
tee_shm_put(shm);
|
||||
return -EINVAL;
|
||||
}
|
||||
} else if (ctx->cap_memref_null) {
|
||||
/* Pass NULL pointer to OP-TEE */
|
||||
shm = NULL;
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
params[n].u.memref.shm_offs = ip.a;
|
||||
params[n].u.memref.size = ip.b;
|
||||
params[n].u.memref.shm = shm;
|
||||
rc = param_from_user_memref(ctx, ¶ms[n].u.memref,
|
||||
&ip);
|
||||
if (rc)
|
||||
return rc;
|
||||
break;
|
||||
default:
|
||||
/* Unknown attribute */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user