Multiple persistent object manipulation
xtest 6014 is introduced. It highlights an issue when persistent
objects are manipulated in a loop.
cf. https://github.com/OP-TEE/optee_os/issues/798
Signed-off-by: Pascal Brand <pascal.brand@st.com>
Reviewed-by: Joakim Bech <joakim.bech@linaro.org>
Tested-by: Joakim Bech <joakim.bech@linaro.org> (QEMU)
Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
diff --git a/ta/storage/include/storage.h b/ta/storage/include/storage.h
index a736197..d5609d2 100644
--- a/ta/storage/include/storage.h
+++ b/ta/storage/include/storage.h
@@ -48,5 +48,6 @@
TEE_Result ta_storage_cmd_next_enum(uint32_t param_types, TEE_Param params[4]);
TEE_Result ta_storage_cmd_key_in_persistent(uint32_t param_types,
TEE_Param params[4]);
+TEE_Result ta_storage_cmd_loop(uint32_t param_types, TEE_Param params[4]);
#endif /*STORAGE_H */
diff --git a/ta/storage/include/ta_storage.h b/ta/storage/include/ta_storage.h
index ecaf541..abc6119 100644
--- a/ta/storage/include/ta_storage.h
+++ b/ta/storage/include/ta_storage.h
@@ -31,21 +31,22 @@
#define TA_STORAGE_UUID { 0xb689f2a7, 0x8adf, 0x477a, \
{ 0x9f, 0x99, 0x32, 0xe9, 0x0c, 0x0a, 0xd0, 0xa2 } }
-#define TA_STORAGE_CMD_OPEN 0
-#define TA_STORAGE_CMD_CLOSE 1
-#define TA_STORAGE_CMD_READ 2
-#define TA_STORAGE_CMD_WRITE 3
-#define TA_STORAGE_CMD_CREATE 4
-#define TA_STORAGE_CMD_SEEK 5
-#define TA_STORAGE_CMD_UNLINK 6
-#define TA_STORAGE_CMD_RENAME 7
-#define TA_STORAGE_CMD_TRUNC 8
-#define TA_STORAGE_CMD_ALLOC_ENUM 9
-#define TA_STORAGE_CMD_FREE_ENUM 10
-#define TA_STORAGE_CMD_RESET_ENUM 11
-#define TA_STORAGE_CMD_START_ENUM 12
-#define TA_STORAGE_CMD_NEXT_ENUM 13
-#define TA_STORAGE_CMD_CREATE_OVERWRITE 14
-#define TA_STORAGE_CMD_KEY_IN_PERSISTENT 15
+#define TA_STORAGE_CMD_OPEN 0
+#define TA_STORAGE_CMD_CLOSE 1
+#define TA_STORAGE_CMD_READ 2
+#define TA_STORAGE_CMD_WRITE 3
+#define TA_STORAGE_CMD_CREATE 4
+#define TA_STORAGE_CMD_SEEK 5
+#define TA_STORAGE_CMD_UNLINK 6
+#define TA_STORAGE_CMD_RENAME 7
+#define TA_STORAGE_CMD_TRUNC 8
+#define TA_STORAGE_CMD_ALLOC_ENUM 9
+#define TA_STORAGE_CMD_FREE_ENUM 10
+#define TA_STORAGE_CMD_RESET_ENUM 11
+#define TA_STORAGE_CMD_START_ENUM 12
+#define TA_STORAGE_CMD_NEXT_ENUM 13
+#define TA_STORAGE_CMD_CREATE_OVERWRITE 14
+#define TA_STORAGE_CMD_KEY_IN_PERSISTENT 15
+#define TA_STORAGE_CMD_LOOP 16
#endif /*TA_SKELETON_H */
diff --git a/ta/storage/storage.c b/ta/storage/storage.c
index 2be171e..db13466 100644
--- a/ta/storage/storage.c
+++ b/ta/storage/storage.c
@@ -388,3 +388,38 @@
return result;
}
+TEE_Result ta_storage_cmd_loop(uint32_t param_types, TEE_Param params[4])
+{
+ TEE_ObjectHandle object = TEE_HANDLE_NULL;
+ TEE_Result res;
+ int object_id = 0;
+ uint32_t flags = TEE_DATA_FLAG_OVERWRITE |
+ TEE_DATA_FLAG_ACCESS_WRITE_META;
+ int i = 0;
+
+ (void)param_types;
+ (void)params;
+
+ for (i = 0; i < 20; i++) {
+ DMSG("\n\nLOOP : %d", i);
+ object = TEE_HANDLE_NULL;
+ object_id = i;
+ res = TEE_CreatePersistentObject(TEE_STORAGE_PRIVATE,
+ &object_id, sizeof(int), flags,
+ TEE_HANDLE_NULL, NULL, 0,
+ &object);
+
+ if (res != TEE_SUCCESS) {
+ EMSG("FAIL");
+ return res;
+ }
+
+ res = TEE_CloseAndDeletePersistentObject1(object);
+ if (res != TEE_SUCCESS) {
+ EMSG("FAIL");
+ return res;
+ }
+ }
+
+ return TEE_SUCCESS;
+}
diff --git a/ta/storage/ta_entry.c b/ta/storage/ta_entry.c
index d2efd18..d3bfd0f 100644
--- a/ta/storage/ta_entry.c
+++ b/ta/storage/ta_entry.c
@@ -118,6 +118,9 @@
case TA_STORAGE_CMD_KEY_IN_PERSISTENT:
return ta_storage_cmd_key_in_persistent(nParamTypes, pParams);
+ case TA_STORAGE_CMD_LOOP:
+ return ta_storage_cmd_loop(nParamTypes, pParams);
+
default:
return TEE_ERROR_BAD_PARAMETERS;
}