xtest: fix against uninited session

Client library crashes if we try to work with unitialized session.
This patch adds checks on values returned by TEE_OpenSession() to
avoid segfaults.

Also patch includes minor refactoring to make affected code more clear.

Signed-off-by: Volodymyr Babchuk <vlad.babchuk@gmail.com>
Reviewed-by: Etienne Carriere <etienne.carriere@linaro.org>
Reviewed-by: Igor Opaniuk <igor.opaniuk@linaro.org>
Tested-by: Jerome Forissier <jerome.forissier@linaro.org> (HiKey)
diff --git a/host/xtest/xtest_1000.c b/host/xtest/xtest_1000.c
index bd3ddb1..f46fa00 100644
--- a/host/xtest/xtest_1000.c
+++ b/host/xtest/xtest_1000.c
@@ -411,9 +411,10 @@
 	TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
 	uint32_t ret_orig;
 
-	(void)ADBG_EXPECT_TEEC_SUCCESS(c,
+	if (!ADBG_EXPECT_TEEC_SUCCESS(c,
 		xtest_teec_open_session(&session, &os_test_ta_uuid, NULL,
-					&ret_orig));
+		                        &ret_orig)))
+		return;
 
 	op.params[0].value.a = n;
 	op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
@@ -424,11 +425,11 @@
 		TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_BAD_MEM_ACCESS, &op,
 				   &ret_orig));
 
-	(void)ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
-				      TEEC_InvokeCommand(&session,
-					TA_OS_TEST_CMD_BAD_MEM_ACCESS,
-					&op,
+	(void)ADBG_EXPECT_TEEC_RESULT(c,
+	        TEEC_ERROR_TARGET_DEAD,
+	        TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_BAD_MEM_ACCESS, &op,
 					&ret_orig));
+
 	(void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TEE, ret_orig);
 
 	TEEC_CloseSession(&session);
@@ -482,9 +483,10 @@
 	TEEC_Session session = { 0 };
 	uint32_t ret_orig;
 
-	(void)ADBG_EXPECT_TEEC_SUCCESS(c,
+	if (!ADBG_EXPECT_TEEC_SUCCESS(c,
 		xtest_teec_open_session(&session, &os_test_ta_uuid, NULL,
-					&ret_orig));
+		                        &ret_orig)))
+		return;
 
 	(void)ADBG_EXPECT_TEEC_RESULT(c,
 		TEEC_ERROR_TARGET_DEAD,
@@ -668,15 +670,16 @@
 
 	Do_ADBG_BeginSubCase(c, "Invoke command");
 	{
-		(void)ADBG_EXPECT_TEEC_SUCCESS(c,
+		if (ADBG_EXPECT_TEEC_SUCCESS(c,
 			xtest_teec_open_session(&session, &os_test_ta_uuid,
-						NULL, &ret_orig));
+			                        NULL, &ret_orig))) {
 
-		(void)ADBG_EXPECT_TEEC_SUCCESS(c,
-			TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_CLIENT,
-					   NULL, &ret_orig));
+			(void)ADBG_EXPECT_TEEC_SUCCESS(c,
+			    TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_CLIENT,
+			                       NULL, &ret_orig));
+			TEEC_CloseSession(&session);
+		}
 
-		TEEC_CloseSession(&session);
 	}
 	Do_ADBG_EndSubCase(c, "Invoke command");
 
@@ -688,18 +691,18 @@
 		op.paramTypes = TEEC_PARAM_TYPES(
 			TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
 
-		(void)ADBG_EXPECT_TEEC_SUCCESS(c,
+		if (ADBG_EXPECT_TEEC_SUCCESS(c,
 			xtest_teec_open_session(&session,
 						&os_test_ta_uuid,
 						NULL,
-						&ret_orig));
+			                        &ret_orig))) {
 
-		(void)ADBG_EXPECT_TEEC_SUCCESS(c,
-			TEEC_InvokeCommand(&session,
-					   TA_OS_TEST_CMD_CLIENT_WITH_TIMEOUT,
-					   &op, &ret_orig));
-
-		TEEC_CloseSession(&session);
+			(void)ADBG_EXPECT_TEEC_SUCCESS(c,
+			  TEEC_InvokeCommand(&session,
+			                     TA_OS_TEST_CMD_CLIENT_WITH_TIMEOUT,
+			                     &op, &ret_orig));
+			TEEC_CloseSession(&session);
+		}
 	}
 	Do_ADBG_EndSubCase(c, "Invoke command with timeout");
 
@@ -765,109 +768,70 @@
 }
 #endif
 
-static void xtest_tee_test_1009(ADBG_Case_t *c)
+static void xtest_tee_test_1009_subcase(ADBG_Case_t *c, const char *subcase,
+                                        uint32_t timeout, bool cancel)
 {
 	TEEC_Session session = { 0 };
 	uint32_t ret_orig;
-
-	Do_ADBG_BeginSubCase(c, "TEE Wait 0.1s");
-	{
-		TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
-
-		(void)ADBG_EXPECT_TEEC_SUCCESS(c,
-			xtest_teec_open_session(&session, &os_test_ta_uuid,
-						NULL, &ret_orig));
-
-		(void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
-						    ret_orig);
-
-		op.params[0].value.a = 100;
-		op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
-						 TEEC_NONE, TEEC_NONE);
-
-		(void)ADBG_EXPECT_TEEC_SUCCESS(c,
-			TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_WAIT, &op,
-					   &ret_orig));
-		TEEC_CloseSession(&session);
-	}
-	Do_ADBG_EndSubCase(c, "TEE Wait 0.1s");
-
-	Do_ADBG_BeginSubCase(c, "TEE Wait 0.5s");
-	{
-		TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
-
-		(void)ADBG_EXPECT_TEEC_SUCCESS(c,
-			xtest_teec_open_session(&session, &os_test_ta_uuid,
-						NULL, &ret_orig));
-
-		(void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
-						    ret_orig);
-
-		op.params[0].value.a = 500;
-		op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
-						 TEEC_NONE, TEEC_NONE);
-
-		(void)ADBG_EXPECT_TEEC_SUCCESS(c,
-			TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_WAIT, &op,
-					   &ret_orig));
-
-		(void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
-						    ret_orig);
-		TEEC_CloseSession(&session);
-	}
-	Do_ADBG_EndSubCase(c, "TEE Wait 0.5s");
-
 #ifdef USER_SPACE
-	Do_ADBG_BeginSubCase(c, "TEE Wait 2s cancel");
-	{
-		pthread_t thr;
-		TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
-
-		(void)ADBG_EXPECT_TEEC_SUCCESS(c,
-			xtest_teec_open_session(&session, &os_test_ta_uuid,
-						NULL, &ret_orig));
-
-		(void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
-						    ret_orig);
-
-		op.params[0].value.a = 2000;
-		op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
-						 TEEC_NONE, TEEC_NONE);
-
-		(void)ADBG_EXPECT(c, 0,
-			pthread_create(&thr, NULL, cancellation_thread, &op));
-
-		(void)ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_CANCEL,
-			TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_WAIT, &op,
-					   &ret_orig));
-
-		(void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
-						    ret_orig);
-		(void)ADBG_EXPECT(c, 0, pthread_join(thr, NULL));
-		TEEC_CloseSession(&session);
-	}
-	Do_ADBG_EndSubCase(c, "TEE Wait 2s cancel");
+	pthread_t thr;
 #endif
 
-	Do_ADBG_BeginSubCase(c, "TEE Wait 2s");
+	Do_ADBG_BeginSubCase(c, "%s", subcase);
 	{
 		TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
 
-		(void)ADBG_EXPECT_TEEC_SUCCESS(c,
-			xtest_teec_open_session(&session, &os_test_ta_uuid,
-						NULL, &ret_orig));
+		if (ADBG_EXPECT_TEEC_SUCCESS(c,
+		         xtest_teec_open_session(&session, &os_test_ta_uuid,
+		                                 NULL, &ret_orig))) {
 
-		op.params[0].value.a = 2000;
-		op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
-						 TEEC_NONE, TEEC_NONE);
+			(void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c,
+			           TEEC_ORIGIN_TRUSTED_APP,
+			           ret_orig);
 
-		(void)ADBG_EXPECT_TEEC_SUCCESS(c,
-			TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_WAIT, &op,
-					   &ret_orig));
+			op.params[0].value.a = timeout;
+			op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
+			                                 TEEC_NONE,
+			                                 TEEC_NONE, TEEC_NONE);
+#ifdef USER_SPACE
+			if (cancel) {
+				(void)ADBG_EXPECT(c, 0,
+				      pthread_create(&thr, NULL,
+				                     cancellation_thread, &op));
 
-		TEEC_CloseSession(&session);
+				(void)ADBG_EXPECT_TEEC_RESULT(c,
+				           TEEC_ERROR_CANCEL,
+			                   TEEC_InvokeCommand(&session,
+			                                 TA_OS_TEST_CMD_WAIT,
+			                                  &op,
+			                                  &ret_orig));
+			} else
+#endif
+
+			(void)ADBG_EXPECT_TEEC_SUCCESS(c,
+			           TEEC_InvokeCommand(&session,
+			                              TA_OS_TEST_CMD_WAIT,
+			                              &op,
+			                              &ret_orig));
+#ifdef USER_SPACE
+			if (cancel)
+				(void)ADBG_EXPECT(c, 0, pthread_join(thr, NULL));
+#endif
+
+			TEEC_CloseSession(&session);
+		}
 	}
-	Do_ADBG_EndSubCase(c, "TEE Wait 2s");
+	Do_ADBG_EndSubCase(c, "%s", subcase);
+}
+
+static void xtest_tee_test_1009(ADBG_Case_t *c)
+{
+	xtest_tee_test_1009_subcase(c, "TEE Wait 0.1s", 100, false);
+	xtest_tee_test_1009_subcase(c, "TEE Wait 0.5s", 500, false);
+#ifdef USER_SPACE
+	xtest_tee_test_1009_subcase(c, "TEE Wait 2s cancel", 2000, true);
+#endif
+	xtest_tee_test_1009_subcase(c, "TEE Wait 2s", 2000, false);
 }
 
 static void xtest_tee_test_1010(ADBG_Case_t *c)
@@ -929,9 +893,10 @@
 		uint8_t out[32] = { 0 };
 		int i;
 
-		(void)ADBG_EXPECT_TEEC_SUCCESS(c,
+		if (!ADBG_EXPECT_TEEC_SUCCESS(c,
 			xtest_teec_open_session(&session1, &uuid, NULL,
-						&ret_orig));
+			                        &ret_orig)))
+			return;
 
 		op.params[0].value.a = 0;
 		op.params[1].tmpref.buffer = (void *)in;
@@ -945,9 +910,10 @@
 					   &ret_orig));
 
 		for (i = 1; i < 1000; i++) {
-			(void)ADBG_EXPECT_TEEC_SUCCESS(c,
+			if (!ADBG_EXPECT_TEEC_SUCCESS(c,
 				xtest_teec_open_session(&session2, &uuid, NULL,
-							&ret_orig));
+				                        &ret_orig)))
+				continue;
 
 			op.params[0].value.a = 0;
 			op.params[1].tmpref.buffer = out;