Fix segfault in tests if the driver is not loaded

If the FF-A TEE driver is not loaded the setup phase of the tests will
fail as expected but then the teardown function tries to free
unallocated resources causing a segfault. This patch fixes teardown
functions by first checking if the resources were allocated before
freeing them up.

Signed-off-by: Imre Kis <imre.kis@arm.com>
Change-Id: Icacfdf7d8d3808503cb45a4a9233b7b2479f9aa2
diff --git a/components/app/ts-demo/test/ts-demo_tests.cpp b/components/app/ts-demo/test/ts-demo_tests.cpp
index 2cc8973..92f7369 100644
--- a/components/app/ts-demo/test/ts-demo_tests.cpp
+++ b/components/app/ts-demo/test/ts-demo_tests.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -39,11 +39,15 @@
         delete m_crypto_client;
         m_crypto_client = NULL;
 
-        service_context_close(m_crypto_service_context, m_rpc_session_handle);
-        m_rpc_session_handle = NULL;
+	if (m_crypto_service_context) {
+	        if (m_rpc_session_handle) {
+                        service_context_close(m_crypto_service_context, m_rpc_session_handle);
+                        m_rpc_session_handle = NULL;
+	        }
 
-        service_context_relinquish(m_crypto_service_context);
-        m_crypto_service_context = NULL;
+                service_context_relinquish(m_crypto_service_context);
+                m_crypto_service_context = NULL;
+	}
     }
 
     rpc_session_handle m_rpc_session_handle;
diff --git a/components/service/attestation/test/service/attestation_provisioning_tests.cpp b/components/service/attestation/test/service/attestation_provisioning_tests.cpp
index 4237bdf..204ab4c 100644
--- a/components/service/attestation/test/service/attestation_provisioning_tests.cpp
+++ b/components/service/attestation/test/service/attestation_provisioning_tests.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -42,11 +42,15 @@
     {
         attest_provision_client_deinit();
 
-        service_context_close(m_attest_service_context, m_rpc_session_handle);
-        m_rpc_session_handle = NULL;
+	if (m_attest_service_context) {
+		if (m_rpc_session_handle) {
+			service_context_close(m_attest_service_context, m_rpc_session_handle);
+			m_rpc_session_handle = NULL;
+		}
 
-        service_context_relinquish(m_attest_service_context);
-        m_attest_service_context = NULL;
+		service_context_relinquish(m_attest_service_context);
+		m_attest_service_context = NULL;
+	}
     }
 
     rpc_session_handle m_rpc_session_handle;
diff --git a/components/service/attestation/test/service/attestation_service_tests.cpp b/components/service/attestation/test/service/attestation_service_tests.cpp
index 9fe1f4d..f786035 100644
--- a/components/service/attestation/test/service/attestation_service_tests.cpp
+++ b/components/service/attestation/test/service/attestation_service_tests.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -42,11 +42,15 @@
     {
         psa_iat_client_deinit();
 
-        service_context_close(m_attest_service_context, m_rpc_session_handle);
-        m_rpc_session_handle = NULL;
+	if (m_attest_service_context) {
+		if (m_rpc_session_handle) {
+			service_context_close(m_attest_service_context, m_rpc_session_handle);
+			m_rpc_session_handle = NULL;
+		}
 
-        service_context_relinquish(m_attest_service_context);
-        m_attest_service_context = NULL;
+		service_context_relinquish(m_attest_service_context);
+		m_attest_service_context = NULL;
+	}
     }
 
     rpc_session_handle m_rpc_session_handle;
diff --git a/components/service/crypto/test/service/crypto_service_limit_tests.cpp b/components/service/crypto/test/service/crypto_service_limit_tests.cpp
index c539b43..913fe77 100644
--- a/components/service/crypto/test/service/crypto_service_limit_tests.cpp
+++ b/components/service/crypto/test/service/crypto_service_limit_tests.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -44,11 +44,15 @@
         delete m_crypto_client;
         m_crypto_client = NULL;
 
-        service_context_close(m_crypto_service_context, m_rpc_session_handle);
-        m_rpc_session_handle = NULL;
+	if (m_crypto_service_context) {
+	        if (m_rpc_session_handle) {
+                        service_context_close(m_crypto_service_context, m_rpc_session_handle);
+                        m_rpc_session_handle = NULL;
+	        }
 
-        service_context_relinquish(m_crypto_service_context);
-        m_crypto_service_context = NULL;
+                service_context_relinquish(m_crypto_service_context);
+                m_crypto_service_context = NULL;
+	}
     }
 
     psa_status_t generateVolatileEccKeyPair(std::vector<psa_key_id_t> &key_ids)
diff --git a/components/service/crypto/test/service/extension/cipher/packed-c/cipher_service_packedc_tests.cpp b/components/service/crypto/test/service/extension/cipher/packed-c/cipher_service_packedc_tests.cpp
index d0e7f38..f9da7d8 100644
--- a/components/service/crypto/test/service/extension/cipher/packed-c/cipher_service_packedc_tests.cpp
+++ b/components/service/crypto/test/service/extension/cipher/packed-c/cipher_service_packedc_tests.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -40,11 +40,15 @@
 		delete m_scenarios;
 		m_scenarios = NULL;
 
-		service_context_close(m_crypto_service_context, m_rpc_session_handle);
-		m_rpc_session_handle = NULL;
+		if (m_crypto_service_context) {
+			if (m_rpc_session_handle) {
+				service_context_close(m_crypto_service_context, m_rpc_session_handle);
+				m_rpc_session_handle = NULL;
+			}
 
-		service_context_relinquish(m_crypto_service_context);
-		m_crypto_service_context = NULL;
+			service_context_relinquish(m_crypto_service_context);
+			m_crypto_service_context = NULL;
+		}
 	}
 
 	rpc_session_handle m_rpc_session_handle;
diff --git a/components/service/crypto/test/service/extension/hash/packed-c/hash_service_packedc_tests.cpp b/components/service/crypto/test/service/extension/hash/packed-c/hash_service_packedc_tests.cpp
index 6bc55cf..060169a 100644
--- a/components/service/crypto/test/service/extension/hash/packed-c/hash_service_packedc_tests.cpp
+++ b/components/service/crypto/test/service/extension/hash/packed-c/hash_service_packedc_tests.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -40,11 +40,15 @@
 		delete m_scenarios;
 		m_scenarios = NULL;
 
-		service_context_close(m_crypto_service_context, m_rpc_session_handle);
-		m_rpc_session_handle = NULL;
+		if (m_crypto_service_context) {
+			if (m_rpc_session_handle) {
+				service_context_close(m_crypto_service_context, m_rpc_session_handle);
+				m_rpc_session_handle = NULL;
+			}
 
-		service_context_relinquish(m_crypto_service_context);
-		m_crypto_service_context = NULL;
+			service_context_relinquish(m_crypto_service_context);
+			m_crypto_service_context = NULL;
+		}
 	}
 
 	rpc_session_handle m_rpc_session_handle;
diff --git a/components/service/crypto/test/service/extension/key_derivation/packed-c/key_derivation_service_packedc_tests.cpp b/components/service/crypto/test/service/extension/key_derivation/packed-c/key_derivation_service_packedc_tests.cpp
index 261bf98..c322437 100644
--- a/components/service/crypto/test/service/extension/key_derivation/packed-c/key_derivation_service_packedc_tests.cpp
+++ b/components/service/crypto/test/service/extension/key_derivation/packed-c/key_derivation_service_packedc_tests.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -40,11 +40,15 @@
 		delete m_scenarios;
 		m_scenarios = NULL;
 
-		service_context_close(m_crypto_service_context, m_rpc_session_handle);
-		m_rpc_session_handle = NULL;
+		if (m_crypto_service_context) {
+			if (m_rpc_session_handle) {
+				service_context_close(m_crypto_service_context, m_rpc_session_handle);
+				m_rpc_session_handle = NULL;
+			}
 
-		service_context_relinquish(m_crypto_service_context);
-		m_crypto_service_context = NULL;
+			service_context_relinquish(m_crypto_service_context);
+			m_crypto_service_context = NULL;
+		}
 	}
 
 	rpc_session_handle m_rpc_session_handle;
diff --git a/components/service/crypto/test/service/extension/mac/packed-c/mac_service_packedc_tests.cpp b/components/service/crypto/test/service/extension/mac/packed-c/mac_service_packedc_tests.cpp
index 6ead054..d6c1c30 100644
--- a/components/service/crypto/test/service/extension/mac/packed-c/mac_service_packedc_tests.cpp
+++ b/components/service/crypto/test/service/extension/mac/packed-c/mac_service_packedc_tests.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -40,11 +40,15 @@
 		delete m_scenarios;
 		m_scenarios = NULL;
 
-		service_context_close(m_crypto_service_context, m_rpc_session_handle);
-		m_rpc_session_handle = NULL;
+		if (m_crypto_service_context) {
+			if (m_rpc_session_handle) {
+				service_context_close(m_crypto_service_context, m_rpc_session_handle);
+				m_rpc_session_handle = NULL;
+			}
 
-		service_context_relinquish(m_crypto_service_context);
-		m_crypto_service_context = NULL;
+			service_context_relinquish(m_crypto_service_context);
+			m_crypto_service_context = NULL;
+		}
 	}
 
 	rpc_session_handle m_rpc_session_handle;
diff --git a/components/service/crypto/test/service/packed-c/crypto_service_packedc_tests.cpp b/components/service/crypto/test/service/packed-c/crypto_service_packedc_tests.cpp
index ea23843..a02d646 100644
--- a/components/service/crypto/test/service/packed-c/crypto_service_packedc_tests.cpp
+++ b/components/service/crypto/test/service/packed-c/crypto_service_packedc_tests.cpp
@@ -40,11 +40,15 @@
 		delete m_scenarios;
 		m_scenarios = NULL;
 
-		service_context_close(m_crypto_service_context, m_rpc_session_handle);
-		m_rpc_session_handle = NULL;
+		if (m_crypto_service_context) {
+			if (m_rpc_session_handle) {
+				service_context_close(m_crypto_service_context, m_rpc_session_handle);
+				m_rpc_session_handle = NULL;
+			}
 
-		service_context_relinquish(m_crypto_service_context);
-		m_crypto_service_context = NULL;
+			service_context_relinquish(m_crypto_service_context);
+			m_crypto_service_context = NULL;
+		}
 	}
 
 	rpc_session_handle m_rpc_session_handle;
diff --git a/components/service/crypto/test/service/protobuf/crypto_service_protobuf_tests.cpp b/components/service/crypto/test/service/protobuf/crypto_service_protobuf_tests.cpp
index c172ad4..885ebdc 100644
--- a/components/service/crypto/test/service/protobuf/crypto_service_protobuf_tests.cpp
+++ b/components/service/crypto/test/service/protobuf/crypto_service_protobuf_tests.cpp
@@ -40,11 +40,15 @@
         delete m_scenarios;
         m_scenarios = NULL;
 
-        service_context_close(m_crypto_service_context, m_rpc_session_handle);
-        m_rpc_session_handle = NULL;
+	if (m_crypto_service_context) {
+	        if (m_rpc_session_handle) {
+                        service_context_close(m_crypto_service_context, m_rpc_session_handle);
+                        m_rpc_session_handle = NULL;
+	        }
 
-        service_context_relinquish(m_crypto_service_context);
-        m_crypto_service_context = NULL;
+                service_context_relinquish(m_crypto_service_context);
+                m_crypto_service_context = NULL;
+	}
     }
 
     rpc_session_handle m_rpc_session_handle;
diff --git a/components/service/discovery/test/service/discovery_service_tests.cpp b/components/service/discovery/test/service/discovery_service_tests.cpp
index 654986e..eab0c20 100644
--- a/components/service/discovery/test/service/discovery_service_tests.cpp
+++ b/components/service/discovery/test/service/discovery_service_tests.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -36,11 +36,15 @@
 
 	void teardown()
 	{
-		service_context_close(m_service_context, m_rpc_session_handle);
-		m_rpc_session_handle = NULL;
+		if (m_service_context) {
+			if (m_rpc_session_handle) {
+				service_context_close(m_service_context, m_rpc_session_handle);
+				m_rpc_session_handle = NULL;
+			}
 
-		service_context_relinquish(m_service_context);
-		m_service_context = NULL;
+			service_context_relinquish(m_service_context);
+			m_service_context = NULL;
+		}
 	}
 
 	struct rpc_caller *m_caller;
diff --git a/components/service/secure_storage/test/service/its_service_tests.cpp b/components/service/secure_storage/test/service/its_service_tests.cpp
index b976d61..8706a1e 100644
--- a/components/service/secure_storage/test/service/its_service_tests.cpp
+++ b/components/service/secure_storage/test/service/its_service_tests.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -43,11 +43,15 @@
     {
         psa_its_frontend_init(NULL);
 
-        service_context_close(m_its_service_context, m_rpc_session_handle);
-        m_rpc_session_handle = NULL;
+	if (m_its_service_context) {
+		if (m_rpc_session_handle) {
+			service_context_close(m_its_service_context, m_rpc_session_handle);
+			m_rpc_session_handle = NULL;
+		}
 
-        service_context_relinquish(m_its_service_context);
-        m_its_service_context = NULL;
+		service_context_relinquish(m_its_service_context);
+		m_its_service_context = NULL;
+	}
 
         secure_storage_client_deinit(&m_storage_client);
     }
diff --git a/components/service/secure_storage/test/service/ps_service_tests.cpp b/components/service/secure_storage/test/service/ps_service_tests.cpp
index fd19f08..cdb8bb7 100644
--- a/components/service/secure_storage/test/service/ps_service_tests.cpp
+++ b/components/service/secure_storage/test/service/ps_service_tests.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -47,11 +47,15 @@
         psa_ps_frontend_init(NULL);
         psa_its_frontend_init(NULL);
 
-        service_context_close(m_its_service_context, m_rpc_session_handle);
-        m_rpc_session_handle = NULL;
+	if (m_its_service_context) {
+		if (m_rpc_session_handle) {
+			service_context_close(m_its_service_context, m_rpc_session_handle);
+			m_rpc_session_handle = NULL;
+		}
 
-        service_context_relinquish(m_its_service_context);
-        m_its_service_context = NULL;
+		service_context_relinquish(m_its_service_context);
+		m_its_service_context = NULL;
+	}
 
         secure_storage_client_deinit(&m_storage_client);
     }
diff --git a/components/service/smm_variable/test/service/smm_variable_attack_tests.cpp b/components/service/smm_variable/test/service/smm_variable_attack_tests.cpp
index ce9aa3c..0a98a22 100644
--- a/components/service/smm_variable/test/service/smm_variable_attack_tests.cpp
+++ b/components/service/smm_variable/test/service/smm_variable_attack_tests.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -44,11 +44,15 @@
 		delete m_client;
 		m_client = NULL;
 
-		service_context_close(m_service_context, m_rpc_session_handle);
-		m_rpc_session_handle = NULL;
+		if (m_service_context) {
+			if (m_rpc_session_handle) {
+				service_context_close(m_service_context, m_rpc_session_handle);
+				m_rpc_session_handle = NULL;
+			}
 
-		service_context_relinquish(m_service_context);
-		m_service_context = NULL;
+			service_context_relinquish(m_service_context);
+			m_service_context = NULL;
+		}
 	}
 
 	void setup_common_guid()
diff --git a/components/service/smm_variable/test/service/smm_variable_service_tests.cpp b/components/service/smm_variable/test/service/smm_variable_service_tests.cpp
index 4672b26..4108d51 100644
--- a/components/service/smm_variable/test/service/smm_variable_service_tests.cpp
+++ b/components/service/smm_variable/test/service/smm_variable_service_tests.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -42,11 +42,15 @@
 		delete m_client;
 		m_client = NULL;
 
-		service_context_close(m_service_context, m_rpc_session_handle);
-		m_rpc_session_handle = NULL;
+		if (m_service_context) {
+			if (m_rpc_session_handle) {
+				service_context_close(m_service_context, m_rpc_session_handle);
+				m_rpc_session_handle = NULL;
+			}
 
-		service_context_relinquish(m_service_context);
-		m_service_context = NULL;
+			service_context_relinquish(m_service_context);
+			m_service_context = NULL;
+		}
 	}
 
 	void setup_common_guid()
diff --git a/components/service/test_runner/test/service/test_runner_service_tests.cpp b/components/service/test_runner/test/service/test_runner_service_tests.cpp
index 8d68bca..774465d 100644
--- a/components/service/test_runner/test/service/test_runner_service_tests.cpp
+++ b/components/service/test_runner/test/service/test_runner_service_tests.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -45,11 +45,15 @@
         delete m_test_runner_client;
         m_test_runner_client = NULL;
 
-        service_context_close(m_test_runner_service_context, m_rpc_session_handle);
-        m_rpc_session_handle = NULL;
+	if (m_test_runner_service_context) {
+	        if (m_rpc_session_handle) {
+                        service_context_close(m_test_runner_service_context, m_rpc_session_handle);
+                        m_rpc_session_handle = NULL;
+	        }
 
-        service_context_relinquish(m_test_runner_service_context);
-        m_test_runner_service_context = NULL;
+                service_context_relinquish(m_test_runner_service_context);
+                m_test_runner_service_context = NULL;
+	}
     }
 
     rpc_session_handle m_rpc_session_handle;