aboutsummaryrefslogtreecommitdiff
path: root/cmd/optee_rpmb.c
diff options
context:
space:
mode:
authorIgor Opaniuk <igor.opaniuk@gmail.com>2024-04-04 15:19:48 +0200
committerIlias Apalodimas <ilias.apalodimas@linaro.org>2024-04-18 16:04:48 +0300
commitfbdaafbb80506bc931d3940396cb86d257703de1 (patch)
treebefbb72ccc144cb56558dd71ae5fb0d2146fbfc0 /cmd/optee_rpmb.c
parent6e8bb1fb0ae81ff02e1057d47bcb08ca2d84d27b (diff)
downloadu-boot-fbdaafbb80506bc931d3940396cb86d257703de1.zip
u-boot-fbdaafbb80506bc931d3940396cb86d257703de1.tar.gz
u-boot-fbdaafbb80506bc931d3940396cb86d257703de1.tar.bz2
cmd: optee_rpmb: close tee session
Close tee session after each optee_rpmb invocation, as there is no reason to keep it open, considering the absence of any available mechanism to clean up all open sessions automatically before handing over control to the Linux kernel. Without proper clean-up we might end up with orphaned sessions registered in OP-TEE OS core (obvious resource leak). Signed-off-by: Igor Opaniuk <igor.opaniuk@gmail.com> Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Diffstat (limited to 'cmd/optee_rpmb.c')
-rw-r--r--cmd/optee_rpmb.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/cmd/optee_rpmb.c b/cmd/optee_rpmb.c
index e0e44bb..b3cafd9 100644
--- a/cmd/optee_rpmb.c
+++ b/cmd/optee_rpmb.c
@@ -87,8 +87,10 @@ static int read_persistent_value(const char *name,
rc = tee_shm_alloc(tee, name_size,
TEE_SHM_ALLOC, &shm_name);
- if (rc)
- return -ENOMEM;
+ if (rc) {
+ rc = -ENOMEM;
+ goto close_session;
+ }
rc = tee_shm_alloc(tee, buffer_size,
TEE_SHM_ALLOC, &shm_buf);
@@ -125,6 +127,9 @@ out:
tee_shm_free(shm_buf);
free_name:
tee_shm_free(shm_name);
+close_session:
+ tee_close_session(tee, session);
+ tee = NULL;
return rc;
}
@@ -139,17 +144,20 @@ static int write_persistent_value(const char *name,
struct tee_param param[2];
size_t name_size = strlen(name) + 1;
+ if (!value_size)
+ return -EINVAL;
+
if (!tee) {
if (avb_ta_open_session())
return -ENODEV;
}
- if (!value_size)
- return -EINVAL;
rc = tee_shm_alloc(tee, name_size,
TEE_SHM_ALLOC, &shm_name);
- if (rc)
- return -ENOMEM;
+ if (rc) {
+ rc = -ENOMEM;
+ goto close_session;
+ }
rc = tee_shm_alloc(tee, value_size,
TEE_SHM_ALLOC, &shm_buf);
@@ -178,6 +186,9 @@ out:
tee_shm_free(shm_buf);
free_name:
tee_shm_free(shm_name);
+close_session:
+ tee_close_session(tee, session);
+ tee = NULL;
return rc;
}