Hello arm-soc maintainers,
Please pull these TEE subsystem and OP-TEE driver fixes which by coincident
all are concerning memory shared with secure world.
There's one in particular nasty race fixed when a tee_shm is about to be
teared down.
Thanks,
Jens
The following changes since commit d58071a8a76d779eedab38033ae4c821c30295a5:
Linux 5.16-rc3 (2021-11-28 14:09:19 -0800)
are available in the Git repository at:
https://git.linaro.org/people/jens.wiklander/linux-tee.git tags/fixes-for-v5.16
for you to fetch changes up to 6add87fdae9bcb1d20b4503df5bd02ce5246cc8b:
optee: Suppress false positive kmemleak report in optee_handle_rpc() (2021-12-16 15:32:48 +0100)
----------------------------------------------------------------
TEE and OP-TEE fixes for v5.16
- Fixes a race when a tee_shm reaches reference count 0 and is about to
be teared down
- Fixes an incorrect page free bug in an error path of the OP-TEE shared
memory pool handling
- Suppresses a false positive kmemleak report when allocating driver
private shared memory buffers for OP-TEE
----------------------------------------------------------------
Jens Wiklander (1):
tee: handle lookup of shm with reference count 0
Sumit Garg (1):
tee: optee: Fix incorrect page free bug
Xiaolei Wang (1):
optee: Suppress false positive kmemleak report in optee_handle_rpc()
drivers/tee/optee/core.c | 6 +-
drivers/tee/optee/smc_abi.c | 2 +
drivers/tee/tee_shm.c | 174 +++++++++++++++++---------------------------
include/linux/tee_drv.h | 4 +-
4 files changed, 72 insertions(+), 114 deletions(-)
Pointer to the allocated pages (struct page *page) has already
progressed towards the end of allocation. It is incorrect to perform
__free_pages(page, order) using this pointer as we would free any
arbitrary pages. Fix this by stop modifying the page pointer.
Fixes: ec185dd3ab25 ("optee: Fix memory leak when failing to register shm pages")
Cc: stable(a)vger.kernel.org
Reported-by: Patrik Lantz <patrik.lantz(a)axis.com>
Signed-off-by: Sumit Garg <sumit.garg(a)linaro.org>
Reviewed-by: Tyler Hicks <tyhicks(a)linux.microsoft.com>
---
Changes since v1:
- Added stable CC tag.
- Picked up Tyler's review tag.
drivers/tee/optee/core.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c
index ab2edfcc6c70..2a66a5203d2f 100644
--- a/drivers/tee/optee/core.c
+++ b/drivers/tee/optee/core.c
@@ -48,10 +48,8 @@ int optee_pool_op_alloc_helper(struct tee_shm_pool_mgr *poolm,
goto err;
}
- for (i = 0; i < nr_pages; i++) {
- pages[i] = page;
- page++;
- }
+ for (i = 0; i < nr_pages; i++)
+ pages[i] = page + i;
shm->flags |= TEE_SHM_REGISTER;
rc = shm_register(shm->ctx, shm, pages, nr_pages,
--
2.25.1
Hi,
In light of the holiday season we are not expecting too many joiners on Dec
23. Hence, let's cancel the LOC (Linaro OP-TEE Contribution) monthly
meeting scheduled for next week.
Wish you all a great holiday and a happy new year. The next scheduled
meeting will be on 27th January 2022.
Regards,
Ruchika
(On behalf of OP-TEE team)
Hi
Me and Patrik have been tracing a kernel memory corruption bug that is
triggered when op-tee runs out of resources and returns an error from
the OPTEE_MSG_CMD_REGISTER_SHM call. This is yet another fall-out from
Patrik's fuzzing of the TEE subsystem.
The symptoms would look like this when page debugging is enabled:
BUG: Bad page state in process optee_example_h pfn:46bb0
page:(ptrval) refcount:-1 mapcount:0 mapping:00000000 index:0x0 pfn:0x46bb0
flags: 0x0(zone=0)
Our reproducer runs a loop with the TEE_IOC_SHM_ALLOC until memory runs
out at the optee-os end (dynamic SHM enabled). The error is 100%
reproducible with such a loop.
We have traced this down to what seems to be a miss in the memory
ownership contract during the call to OPTEE_MSG_CMD_REGISTER_SHM.
When pool_op_alloc() detects that optee_shm_register() has failed, it
will free the allocated page at the very end of the function.
Unfortunately that page has already been freed because OP-TEE has sent a
OPTEE_RPC_CMD_SHM_FREE for this shm object before returning from
OPTEE_MSG_CMD_REGISTER_SHM. This is my conclusion based on prints added
to the code.
I cannot write a patch for this because I am at a loss of who actually
is supposed to trigger the free of the pages in this situation. Is there
an API spec that makes this clear ?
BR,
Lars
Pointer to the allocated pages (struct page *page) has already
progressed towards the end of allocation. It is incorrect to perform
__free_pages(page, order) using this pointer as we would free any
arbitrary pages. Fix this by stop modifying the page pointer.
Fixes: ec185dd3ab25 ("optee: Fix memory leak when failing to register shm pages")
Reported-by: Patrik Lantz <patrik.lantz(a)axis.com>
Signed-off-by: Sumit Garg <sumit.garg(a)linaro.org>
---
drivers/tee/optee/core.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c
index ab2edfcc6c70..2a66a5203d2f 100644
--- a/drivers/tee/optee/core.c
+++ b/drivers/tee/optee/core.c
@@ -48,10 +48,8 @@ int optee_pool_op_alloc_helper(struct tee_shm_pool_mgr *poolm,
goto err;
}
- for (i = 0; i < nr_pages; i++) {
- pages[i] = page;
- page++;
- }
+ for (i = 0; i < nr_pages; i++)
+ pages[i] = page + i;
shm->flags |= TEE_SHM_REGISTER;
rc = shm_register(shm->ctx, shm, pages, nr_pages,
--
2.25.1
Hello arm-soc maintainers,
Please pull these patches which adds support for asynchronous notifications
from OP-TEE in secure world to the OP-TEE driver.
An edge-triggered interrupt is used to notify the the driver.
These patches has been in linux-next for a few weeks already.
Thanks,
Jens
The following changes since commit fa55b7dcdc43c1aa1ba12bca9d2dd4318c2a0dbf:
Linux 5.16-rc1 (2021-11-14 13:56:52 -0800)
are available in the Git repository at:
https://git.linaro.org/people/jens.wiklander/linux-tee.git tags/optee-async-notif-for-v5.17
for you to fetch changes up to b98aee466d194788bd651cb375b0e0f7e0e69865:
optee: Fix NULL but dereferenced coccicheck error (2021-11-29 22:02:25 +0100)
----------------------------------------------------------------
OP-TEE Asynchronous notifications from secure world
Adds support in the SMC based OP-TEE driver to receive asynchronous
notifications from secure world using an edge-triggered interrupt as
delivery mechanism.
----------------------------------------------------------------
Jens Wiklander (6):
docs: staging/tee.rst: add a section on OP-TEE notifications
dt-bindings: arm: optee: add interrupt property
tee: fix put order in teedev_close_context()
tee: export teedev_open() and teedev_close_context()
optee: separate notification functions
optee: add asynchronous notifications
Yang Li (1):
optee: Fix NULL but dereferenced coccicheck error
.../bindings/arm/firmware/linaro,optee-tz.yaml | 8 +
Documentation/staging/tee.rst | 30 +++
drivers/tee/optee/Makefile | 1 +
drivers/tee/optee/core.c | 2 +-
drivers/tee/optee/ffa_abi.c | 6 +-
drivers/tee/optee/notif.c | 125 +++++++++++
drivers/tee/optee/optee_msg.h | 9 +
drivers/tee/optee/optee_private.h | 28 ++-
drivers/tee/optee/optee_rpc_cmd.h | 31 +--
drivers/tee/optee/optee_smc.h | 75 ++++++-
drivers/tee/optee/rpc.c | 71 +-----
drivers/tee/optee/smc_abi.c | 237 ++++++++++++++++++---
drivers/tee/tee_core.c | 10 +-
include/linux/tee_drv.h | 14 ++
14 files changed, 523 insertions(+), 124 deletions(-)
create mode 100644 drivers/tee/optee/notif.c