Add corner cases for CounterSign

This should increase coverage
diff --git a/src/CounterSign.c b/src/CounterSign.c
index 7047aa0..14c9a02 100644
--- a/src/CounterSign.c
+++ b/src/CounterSign.c
@@ -25,8 +25,6 @@
 		return true;
 	}
 
-	_COSE_RemoveFromList(&CountersignRoot, &pSigner->m_signer.m_message);
-
 	_COSE_SignerInfo_Release(&pSigner->m_signer);
 
 	COSE_FREE(pSigner, &pSigner->m_signer.m_message.m_allocContext);
@@ -54,7 +52,11 @@
 	CHECK_CONDITION(cbor->type == CN_CBOR_ARRAY, COSE_ERR_INVALID_PARAMETER);
 	if (!_COSE_SignerInfo_Init_From_Object(
 			cbor, &pobj->m_signer, CBOR_CONTEXT_PARAM_COMMA perr)) {
-		goto errorReturn;
+		_COSE_SignerInfo_Release(&pobj->m_signer);
+		if (pIn == NULL) {
+			COSE_FREE(pobj, context);
+		}
+		return NULL;
 	}
 
 	if (pIn == NULL) {
@@ -112,6 +114,8 @@
 		return true;
 	}
 
+	_COSE_RemoveFromList(&CountersignRoot, &p->m_signer.m_message);
+	
 	fRet = _COSE_CounterSign_Free(p);
 
 errorReturn:
@@ -127,8 +131,7 @@
 	COSE_CounterSign* pSigner = (COSE_CounterSign*)hSigner;
 
 	CHECK_CONDITION(IsValidCounterSignHandle(hSigner), COSE_ERR_INVALID_HANDLE);
-	CHECK_CONDITION(pSigner->m_signer.m_message.m_counterSigners == NULL,
-		COSE_ERR_INVALID_PARAMETER);
+	CHECK_CONDITION(pSigner->m_next == NULL, COSE_ERR_INVALID_PARAMETER);
 
 	pSigner->m_next = pMessage->m_counterSigners;
 	pMessage->m_counterSigners = pSigner;
diff --git a/src/SignerInfo.c b/src/SignerInfo.c
index 8d117c5..0fd4204 100644
--- a/src/SignerInfo.c
+++ b/src/SignerInfo.c
@@ -123,11 +123,9 @@
 	return pSigner;
 
 errorReturn:
-	if (pSigner != NULL) {
+	if (pSigner != NULL && pIn == NULL) {
 		_COSE_SignerInfo_Release(pSigner);
-		if (pIn == NULL) {
-			COSE_FREE(pSigner, context);
-		}
+		COSE_FREE(pSigner, context);
 	}
 	return NULL;
 }
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 58b5ceb..18dd494 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -1,6 +1,6 @@
 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dist_dir}/test)
 
-add_executable(cose_test test.c json.c encrypt.c sign.c context.c mac_test.c)
+add_executable(cose_test test.c json.c encrypt.c sign.c context.c mac_test.c CounterSign_test.c)
 
 target_link_libraries(cose_test PRIVATE cose-c::cose-c cn-cbor::cn-cbor)
 
@@ -176,3 +176,10 @@
   NAME Memory-sign-eddsa
   WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
   COMMAND cose_test --memory Examples/eddsa-examples/eddsa-01.json)
+
+if(COSE_C_INCLUDE_COUNTERSIGN)
+  add_test(
+    NAME Memory-Countersign
+    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+    COMMAND cose_test --memory Examples/countersign/mac0-01.json)
+endif()
diff --git a/test/CounterSign_test.c b/test/CounterSign_test.c
new file mode 100644
index 0000000..3b9d53a
--- /dev/null
+++ b/test/CounterSign_test.c
@@ -0,0 +1,87 @@
+//  encrypt.c
+
+#define _CRT_SECURE_NO_WARNINGS
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <cose/cose.h>
+#include <cose/cose_configure.h>
+#include <cn-cbor/cn-cbor.h>
+
+#include "test.h"
+#include "cose_int.h"
+
+void CounterSign_Corners()
+{
+	HCOSE_COUNTERSIGN hCounterSign = NULL;
+	HCOSE_COUNTERSIGN hBadHandle = NULL;
+	HCOSE_COUNTERSIGN hNULL = NULL;
+	cose_errback cose_error;
+	byte rgb[10];
+
+	cn_cbor *cn = cn_cbor_int_create(5, CBOR_CONTEXT_PARAM_COMMA NULL);
+	
+	hCounterSign = COSE_CounterSign_Init(CBOR_CONTEXT_PARAM_COMMA NULL);
+	hBadHandle = (HCOSE_COUNTERSIGN)COSE_CALLOC(1, sizeof(COSE), context);
+	HCOSE_SIGN1 hSign1 =
+		COSE_Sign1_Init(0, CBOR_CONTEXT_PARAM_COMMA & cose_error);
+
+	//  Look for invalid parameter
+	//		Null handle checks
+	//		bad handle checks
+	//		null pointers
+
+	CHECK_FAILURE(
+		COSE_CounterSign_map_get_int(hNULL, 1, COSE_BOTH, &cose_error),
+		COSE_ERR_INVALID_HANDLE, CFails++);
+	CHECK_FAILURE(
+		COSE_CounterSign_map_get_int(hNULL, 1, COSE_BOTH, &cose_error),
+		COSE_ERR_INVALID_HANDLE, CFails++);
+	CHECK_FAILURE(
+		COSE_CounterSign_map_get_int(hCounterSign, 1, COSE_BOTH, &cose_error),
+		COSE_ERR_INVALID_PARAMETER, CFails++);
+
+	CHECK_FAILURE(COSE_CounterSign_map_put_int(
+					  hNULL, 1, cn, COSE_PROTECT_ONLY, &cose_error),
+		COSE_ERR_INVALID_HANDLE, CFails++);
+	CHECK_FAILURE(COSE_CounterSign_map_put_int(
+					  hNULL, 1, cn, COSE_PROTECT_ONLY, &cose_error),
+		COSE_ERR_INVALID_HANDLE, CFails++);
+	CHECK_FAILURE(COSE_CounterSign_map_put_int(
+					  hNULL, 1, NULL, COSE_PROTECT_ONLY, &cose_error),
+		COSE_ERR_INVALID_HANDLE, CFails++);
+	CHECK_FAILURE(COSE_CounterSign_map_put_int(hCounterSign, 1, cn,
+					  COSE_PROTECT_ONLY | COSE_UNPROTECT_ONLY, &cose_error),
+		COSE_ERR_INVALID_PARAMETER, CFails++);
+
+	CHECK_FAILURE(COSE_Sign1_add_countersignature(hSign1, hBadHandle, &cose_error),
+		COSE_ERR_INVALID_HANDLE, CFails++);
+	((COSE_CounterSign *)hCounterSign)->m_next = (COSE_CounterSign *)hBadHandle;
+	CHECK_FAILURE(
+		COSE_Sign1_add_countersignature(hSign1, hCounterSign, &cose_error),
+		COSE_ERR_INVALID_PARAMETER, CFails++);
+	CHECK_FAILURE(COSE_Sign1_get_countersignature(hSign1, 3, &cose_error),
+		COSE_ERR_INVALID_PARAMETER, CFails++);
+	((COSE_CounterSign *)hCounterSign)->m_next = NULL;
+	COSE_Sign1_add_countersignature(hSign1, hCounterSign, &cose_error);
+	CHECK_FAILURE(COSE_Sign1_get_countersignature(hSign1, 3, &cose_error),
+		COSE_ERR_INVALID_PARAMETER, CFails++);
+
+	CHECK_FAILURE(
+		COSE_CounterSign_SetExternal(hNULL, rgb, sizeof(rgb), &cose_error),
+		COSE_ERR_INVALID_HANDLE, CFails++);
+	CHECK_FAILURE(
+		COSE_CounterSign_SetExternal(hBadHandle, rgb, sizeof(rgb), &cose_error),
+		COSE_ERR_INVALID_HANDLE, CFails++);
+	COSE_CounterSign_SetExternal(hCounterSign, rgb, sizeof(rgb), &cose_error);
+	
+	
+	CHECK_RETURN(!COSE_CounterSign_Free(hBadHandle), false, CFails++);
+
+	COSE_CounterSign_Free(hCounterSign);
+	COSE_Sign1_Free(hSign1);
+
+
+	
+}
diff --git a/test/test.c b/test/test.c
index b943227..1af4a38 100644
--- a/test/test.c
+++ b/test/test.c
@@ -865,6 +865,9 @@
 #if INCLUDE_ENCRYPT || INCLUDE_MAC
 	Recipient_Corners();
 #endif
+#if INCLUDE_COUNTERSIGNATURE
+	CounterSign_Corners();
+#endif
 }
 
 void RunMemoryTest(const char* szFileName)
@@ -906,6 +909,12 @@
 				if (IsContextEmpty(context) != 0) {
 					CFails += 1;
 				}
+#ifndef NDEBUG
+				if (!AreListsEmpty()) {
+					CFails += 1;
+					break;
+				}
+#endif
 				FreeContext(context);
 			}
 
@@ -919,6 +928,12 @@
 				if (IsContextEmpty(context) != 0) {
 					CFails += 1;
 				}
+#ifndef NDEBUG
+				if (!AreListsEmpty()) {
+					CFails += 1;
+					break;
+				}
+#endif
 				FreeContext(context);
 			}
 #else
diff --git a/test/test.h b/test/test.h
index 7fefe47..19a402f 100644
--- a/test/test.h
+++ b/test/test.h
@@ -21,6 +21,7 @@
 void Enveloped_Corners();
 void Encrypt_Corners();
 void Recipient_Corners();
+void CounterSign_Corners();
 
 //  sign.c