|
|
9142b8 |
From 3a68f90c2a5a208b475cc2014f85ae04541ec5b6 Mon Sep 17 00:00:00 2001
|
|
|
9142b8 |
From: Eugene Syromyatnikov <evgsyr@gmail.com>
|
|
|
9142b8 |
Date: Fri, 20 Aug 2021 21:31:01 +0200
|
|
|
9142b8 |
Subject: [PATCH 150/150] tee: rewrite num_params access in tee_fetch_buf_data
|
|
|
9142b8 |
|
|
|
9142b8 |
Pointer to num_params field of the fetched structure is passed in a
|
|
|
9142b8 |
separate function argument which provokes covscan complaints about
|
|
|
9142b8 |
uninitialised accesses and also tingles my aliasing rules senses.
|
|
|
9142b8 |
Rewrite to access it via the arg_struct argument which is fetched
|
|
|
9142b8 |
earlier in the function flow.
|
|
|
9142b8 |
|
|
|
9142b8 |
* src/tee.c (TEE_FETCH_BUF_DATA): Change &arg_.num_params
|
|
|
9142b8 |
to offsetof(typeof(arg_), num_params).
|
|
|
9142b8 |
(tee_fetch_buf_data): Accept offset of the num_params field instead
|
|
|
9142b8 |
of pointer to it; reconstruct the num_params pointer using it.
|
|
|
9142b8 |
---
|
|
|
9142b8 |
src/tee.c | 5 +++--
|
|
|
9142b8 |
1 file changed, 3 insertions(+), 2 deletions(-)
|
|
|
9142b8 |
|
|
|
9142b8 |
diff --git a/src/tee.c b/src/tee.c
|
|
|
9142b8 |
index f9eda52..d7e9b15 100644
|
|
|
9142b8 |
--- a/src/tee.c
|
|
|
9142b8 |
+++ b/src/tee.c
|
|
|
9142b8 |
@@ -33,7 +33,7 @@ struct tee_ioctl_shm_register_fd_data {
|
|
|
9142b8 |
|
|
|
9142b8 |
#define TEE_FETCH_BUF_DATA(buf_, arg_, params_) \
|
|
|
9142b8 |
tee_fetch_buf_data(tcp, arg, &buf_, sizeof(arg_), \
|
|
|
9142b8 |
- &arg_, &arg_.num_params, \
|
|
|
9142b8 |
+ &arg_, offsetof(typeof(arg_), num_params), \
|
|
|
9142b8 |
params_)
|
|
|
9142b8 |
|
|
|
9142b8 |
/* session id is printed as 0x%x in libteec */
|
|
|
9142b8 |
@@ -56,7 +56,7 @@ tee_fetch_buf_data(struct tcb *const tcp,
|
|
|
9142b8 |
struct tee_ioctl_buf_data *buf,
|
|
|
9142b8 |
size_t arg_size,
|
|
|
9142b8 |
void *arg_struct,
|
|
|
9142b8 |
- unsigned *num_params,
|
|
|
9142b8 |
+ size_t num_params_offs,
|
|
|
9142b8 |
uint64_t *params)
|
|
|
9142b8 |
{
|
|
|
9142b8 |
if (umove_or_printaddr(tcp, arg, buf))
|
|
|
9142b8 |
@@ -69,6 +69,7 @@ tee_fetch_buf_data(struct tcb *const tcp,
|
|
|
9142b8 |
tee_print_buf(buf);
|
|
|
9142b8 |
return RVAL_IOCTL_DECODED;
|
|
|
9142b8 |
}
|
|
|
9142b8 |
+ uint32_t *num_params = (uint32_t *) (arg_struct + num_params_offs);
|
|
|
9142b8 |
if (entering(tcp) &&
|
|
|
9142b8 |
(arg_size + TEE_IOCTL_PARAM_SIZE(*num_params) != buf->buf_len)) {
|
|
|
9142b8 |
/*
|
|
|
9142b8 |
--
|
|
|
9142b8 |
2.1.4
|
|
|
9142b8 |
|