diff --git a/src/ssl.c b/src/ssl.c index d1f0247c9..a3559d681 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -16475,7 +16475,7 @@ void wolfSSL_sk_ASN1_OBJECT_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk) /* parse through stack freeing each node */ node = sk->next; - while (sk->num > 1) { + while ((node != NULL) && (sk->num > 1)) { WOLFSSL_STACK* tmp = node; node = node->next; @@ -16499,31 +16499,33 @@ void wolfSSL_sk_ASN1_OBJECT_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk) * f X509 free function */ void wolfSSL_sk_ASN1_OBJECT_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk, - void f (WOLFSSL_ASN1_OBJECT*)) + void (*func)(WOLFSSL_ASN1_OBJECT*)) { WOLFSSL_STACK* node; WOLFSSL_ENTER("wolfSSL_sk_ASN1_OBJECT_pop_free"); - (void)f; + (void)func; - if (sk == NULL) { + if ((sk == NULL) || (func == NULL)) { + WOLFSSL_MSG("Parameter error"); return; } /* parse through stack freeing each node */ node = sk->next; - while (sk->num > 1) { + while ((node != NULL) && (sk->num > 1)) { WOLFSSL_STACK* tmp = node; node = node->next; - f(tmp->data.obj); + func(tmp->data.obj); + XFREE(tmp, NULL, DYNAMIC_TYPE_ASN1); sk->num -= 1; } /* free head of stack */ if (sk->num == 1) { - f(sk->data.obj); + func(sk->data.obj); } XFREE(sk, NULL, DYNAMIC_TYPE_ASN1); } diff --git a/tests/api.c b/tests/api.c index ee30f6a1f..390c7bf34 100644 --- a/tests/api.c +++ b/tests/api.c @@ -23086,6 +23086,75 @@ static void test_wolfSSL_AES_cbc_encrypt() } +static void test_wolfSSL_X509_get_ext_count(void) { +#if !defined(NO_FILESYSTEM) && defined (OPENSSL_ALL) + FILE* f; + WOLFSSL_X509* x509; + int ret = 0; + + AssertNotNull(f = fopen("./certs/server-cert.pem", "rb")); + AssertNotNull(x509 = wolfSSL_PEM_read_X509(f, NULL, NULL, NULL)); + fclose(f); + + printf(testingFmt, "wolfSSL_X509_get_ext_count() valid input"); + AssertIntEQ((ret = wolfSSL_X509_get_ext_count(x509)), 3); + printf(resultFmt, ret == 3 ? passed : failed); + + printf(testingFmt, "wolfSSL_X509_get_ext_count() NULL argument"); + AssertIntEQ((ret = wolfSSL_X509_get_ext_count(NULL)), WOLFSSL_FAILURE); + printf(resultFmt, ret == WOLFSSL_FAILURE ? passed : failed); + + wolfSSL_X509_free(x509); +#endif +} + +static void test_wolfSSL_X509_cmp(void){ +#if defined(OPENSSL_ALL) + FILE* file1; + FILE* file2; + WOLFSSL_X509* cert1; + WOLFSSL_X509* cert2; + int ret = 0; + + AssertNotNull(file1=fopen("./certs/server-cert.pem", "rb")); + AssertNotNull(file2=fopen("./certs/client-cert-3072.pem", "rb")); + + AssertNotNull(cert1 = wolfSSL_PEM_read_X509(file1, NULL, NULL, NULL)); + AssertNotNull(cert2 = wolfSSL_PEM_read_X509(file2, NULL, NULL, NULL)); + fclose(file1); + fclose(file2); + + printf(testingFmt, "wolfSSL_X509_cmp() testing matching certs"); + ret = wolfSSL_X509_cmp(cert1, cert1); + AssertIntEQ(0, wolfSSL_X509_cmp(cert1, cert1)); + printf(resultFmt, ret == 0 ? passed : failed); + + printf(testingFmt, "wolfSSL_X509_cmp() testing mismatched certs"); + ret = wolfSSL_X509_cmp(cert1, cert2); + AssertIntEQ(-1, wolfSSL_X509_cmp(cert1, cert2)); + printf(resultFmt, ret == -1 ? passed : failed); + + printf(testingFmt, "wolfSSL_X509_cmp() testing NULL, valid args"); + ret = wolfSSL_X509_cmp(NULL, cert2); + AssertIntEQ(BAD_FUNC_ARG, wolfSSL_X509_cmp(NULL, cert2)); + printf(resultFmt, ret == BAD_FUNC_ARG ? passed : failed); + + printf(testingFmt, "wolfSSL_X509_cmp() testing valid, NULL args"); + ret = wolfSSL_X509_cmp(cert1, NULL); + AssertIntEQ(BAD_FUNC_ARG, wolfSSL_X509_cmp(cert1, NULL)); + printf(resultFmt, ret == BAD_FUNC_ARG ? passed : failed); + + printf(testingFmt, "wolfSSL_X509_cmp() testing NULL, NULL args"); + ret = wolfSSL_X509_cmp(NULL, NULL); + AssertIntEQ(BAD_FUNC_ARG, wolfSSL_X509_cmp(NULL, NULL)); + printf(resultFmt, ret == BAD_FUNC_ARG ? passed : failed); + + wolfSSL_X509_free(cert1); + wolfSSL_X509_free(cert2); +#endif +} + + static void test_no_op_functions(void) { #if defined(OPENSSL_EXTRA) @@ -25444,6 +25513,10 @@ void ApiTest(void) test_wolfSSL_X509_get_version(); test_wolfSSL_X509_print(); test_wolfSSL_RSA_verify(); + + test_wolfSSL_X509_get_ext_count(); + test_wolfSSL_X509_cmp(); + /* test the no op functions for compatibility */ test_no_op_functions(); diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 1bc952d39..b124ecff6 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -834,8 +834,8 @@ WOLFSSL_API WOLFSSL_ASN1_OBJECT* wolfSSL_sk_ASN1_OBJECT_pop( WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk); WOLFSSL_API void wolfSSL_sk_ASN1_OBJECT_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk); WOLFSSL_API void wolfSSL_sk_ASN1_OBJECT_pop_free( - WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk, - void f (WOLFSSL_ASN1_OBJECT*)); + WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk, + void (*func)(WOLFSSL_ASN1_OBJECT*)); WOLFSSL_API int wolfSSL_ASN1_STRING_to_UTF8(unsigned char **out, WOLFSSL_ASN1_STRING *in); WOLFSSL_API int wolfSSL_set_ex_data(WOLFSSL*, int, void*);