From 28af88788a35d43691ee83f1d3d1d89e60c9d25c Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Thu, 8 Sep 2022 11:55:32 +0200 Subject: [PATCH] Set correct types in wolfSSL_sk_*_new functions - Use WOLF_SK_COMPARE_CB() to generate the correct types instead of using void* for the callback parameters. - Remove WOLFSSL_STACK.comp entirely since it is not used anywhere. Ignore input parameters that used to set this member. --- src/conf.c | 50 +++++++++------------------------------- src/ssl.c | 1 - src/x509.c | 19 ++++++--------- tests/api.c | 2 +- wolfssl/internal.h | 1 - wolfssl/openssl/txt_db.h | 5 ++-- wolfssl/ssl.h | 12 +++++----- 7 files changed, 28 insertions(+), 62 deletions(-) diff --git a/src/conf.c b/src/conf.c index b4cc0eb8b..c8c2d40af 100644 --- a/src/conf.c +++ b/src/conf.c @@ -248,10 +248,11 @@ void wolfSSL_TXT_DB_free(WOLFSSL_TXT_DB *db) } int wolfSSL_TXT_DB_create_index(WOLFSSL_TXT_DB *db, int field, - void* qual, wolf_sk_hash_cb hash, wolf_sk_compare_cb cmp) + void* qual, wolf_sk_hash_cb hash, wolf_lh_compare_cb cmp) { WOLFSSL_ENTER("wolfSSL_TXT_DB_create_index"); (void)qual; + (void)cmp; if (!db || !hash || !cmp || field >= db->num_fields || field < 0) { WOLFSSL_MSG("Bad parameter"); @@ -259,7 +260,6 @@ int wolfSSL_TXT_DB_create_index(WOLFSSL_TXT_DB *db, int field, } db->hash_fn[field] = hash; - db->comp[field] = cmp; return WOLFSSL_SUCCESS; } @@ -274,21 +274,18 @@ WOLFSSL_STRING *wolfSSL_TXT_DB_get_by_index(WOLFSSL_TXT_DB *db, int idx, return NULL; } - if (!db->hash_fn[idx] || !db->comp[idx]) { - WOLFSSL_MSG("Missing hash or cmp functions"); + if (!db->hash_fn[idx]) { + WOLFSSL_MSG("Missing hash functions"); return NULL; } - /* If first data struct has correct hash and cmp function then - * assume others do too */ - if (db->data->hash_fn != db->hash_fn[idx] || - db->data->comp != db->comp[idx]) { + /* If first data struct has correct hash function + * then assume others do too */ + if (db->data->hash_fn != db->hash_fn[idx]) { /* Set the hash and comp functions */ WOLF_STACK_OF(WOLFSSL_STRING)* data = db->data; while (data) { - if (data->comp != db->comp[idx] || - data->hash_fn != db->hash_fn[idx]) { - data->comp = db->comp[idx]; + if (data->hash_fn != db->hash_fn[idx]) { data->hash_fn = db->hash_fn[idx]; data->hash = 0; } @@ -333,32 +330,6 @@ static unsigned long wolfSSL_CONF_VALUE_hash(const WOLFSSL_CONF_VALUE *val) return 0; } -static int wolfssl_conf_value_cmp(const WOLFSSL_CONF_VALUE *a, - const WOLFSSL_CONF_VALUE *b) -{ - int cmp_val; - - if (!a || !b) { - return WOLFSSL_FATAL_ERROR; - } - - if (a->section != b->section) { - if ((cmp_val = XSTRCMP(a->section, b->section)) != 0) { - return cmp_val; - } - } - - if (a->name && b->name) { - return XSTRCMP(a->name, b->name); - } - else if (a->name == b->name) { - return 0; - } - else { - return a->name ? 1 : -1; - } -} - /* Use SHA for hashing as OpenSSL uses a hash algorithm that is * "not as good as MD5, but still good" so using SHA should be more * than good enough for this application. The produced hashes don't @@ -1012,16 +983,17 @@ void wolfSSL_X509V3_conf_free(WOLFSSL_CONF_VALUE *val) } } -WOLFSSL_STACK *wolfSSL_sk_CONF_VALUE_new(wolf_sk_compare_cb compFunc) +WOLFSSL_STACK *wolfSSL_sk_CONF_VALUE_new( + WOLF_SK_COMPARE_CB(WOLFSSL_CONF_VALUE, compFunc)) { WOLFSSL_STACK* ret; WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_new"); ret = wolfSSL_sk_new_node(NULL); if (!ret) return NULL; - ret->comp = compFunc ? compFunc : (wolf_sk_compare_cb)wolfssl_conf_value_cmp; ret->hash_fn = (wolf_sk_hash_cb)wolfSSL_CONF_VALUE_hash; ret->type = STACK_TYPE_CONF_VALUE; + (void)compFunc; return ret; } diff --git a/src/ssl.c b/src/ssl.c index 2bcd1788d..fb969ead0 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -19312,7 +19312,6 @@ int wolfSSL_sk_push(WOLFSSL_STACK* sk, const void *data) sk->num += 1; #ifdef OPENSSL_ALL - node->comp = sk->comp; node->hash_fn = sk->hash_fn; node->hash = sk->hash; sk->hash = 0; diff --git a/src/x509.c b/src/x509.c index 459bf3569..52e735b95 100644 --- a/src/x509.c +++ b/src/x509.c @@ -11542,7 +11542,8 @@ error: defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \ defined(WOLFSSL_OPENSSH) || defined(HAVE_SBLIM_SFCB) -WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_sk_X509_NAME_new(wolf_sk_compare_cb cb) +WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_sk_X509_NAME_new( + WOLF_SK_COMPARE_CB(WOLFSSL_X509_NAME, cb)) { WOLFSSL_STACK* sk; (void)cb; @@ -11552,9 +11553,6 @@ WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_sk_X509_NAME_new(wolf_sk_compare_cb cb sk = wolfSSL_sk_new_node(NULL); if (sk != NULL) { sk->type = STACK_TYPE_X509_NAME; -#ifdef OPENSSL_ALL - sk->comp = cb; -#endif } return sk; @@ -11656,16 +11654,12 @@ int wolfSSL_sk_X509_NAME_find(const WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk, /* Name Entry */ WOLF_STACK_OF(WOLFSSL_X509_NAME_ENTRY)* wolfSSL_sk_X509_NAME_ENTRY_new( - wolf_sk_compare_cb cb) + WOLF_SK_COMPARE_CB(WOLFSSL_X509_NAME_ENTRY, cb)) { WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL); if (sk != NULL) { sk->type = STACK_TYPE_X509_NAME_ENTRY; - #ifdef OPENSSL_ALL - sk->comp = cb; - #else (void)cb; - #endif } return sk; } @@ -11827,7 +11821,7 @@ WOLF_STACK_OF(WOLFSSL_X509_NAME) *wolfSSL_dup_CA_list( WOLFSSL_ENTER("wolfSSL_dup_CA_list"); - copy = wolfSSL_sk_X509_NAME_new(sk->comp); + copy = wolfSSL_sk_X509_NAME_new(NULL); if (copy == NULL) { WOLFSSL_MSG("Memory error"); return NULL; @@ -11867,14 +11861,15 @@ int wolfSSL_sk_X509_OBJECT_num(const WOLF_STACK_OF(WOLFSSL_X509_OBJECT) *s) } int wolfSSL_sk_X509_NAME_set_cmp_func(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk, - wolf_sk_compare_cb cb) + WOLF_SK_COMPARE_CB(WOLFSSL_X509_NAME, cb)) { WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_set_cmp_func"); if (sk == NULL) return BAD_FUNC_ARG; - sk->comp = cb; + WOLFSSL_MSG("Stack comparison not used in wolfSSL"); + (void)cb; return 0; } #endif /* OPENSSL_ALL */ diff --git a/tests/api.c b/tests/api.c index dd40f5d84..5c86daf05 100644 --- a/tests/api.c +++ b/tests/api.c @@ -46674,7 +46674,7 @@ static int test_wolfSSL_TXT_DB(void) /* Test index */ AssertIntEQ(TXT_DB_create_index(db, 3, NULL, (wolf_sk_hash_cb)TXT_DB_hash, - (wolf_sk_compare_cb)TXT_DB_cmp), 1); + (wolf_lh_compare_cb)TXT_DB_cmp), 1); AssertNotNull(TXT_DB_get_by_index(db, 3, (WOLFSSL_STRING*)fields)); fields[3] = "12DA"; AssertNotNull(TXT_DB_get_by_index(db, 3, (WOLFSSL_STRING*)fields)); diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 4ab6887d0..2c21d2056 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -4217,7 +4217,6 @@ struct WOLFSSL_STACK { unsigned long num; /* number of nodes in stack * (safety measure for freeing and shortcut for count) */ #if defined(OPENSSL_ALL) - wolf_sk_compare_cb comp; wolf_sk_hash_cb hash_fn; unsigned long hash; #endif diff --git a/wolfssl/openssl/txt_db.h b/wolfssl/openssl/txt_db.h index 7b1752657..7d091e18d 100644 --- a/wolfssl/openssl/txt_db.h +++ b/wolfssl/openssl/txt_db.h @@ -32,18 +32,19 @@ struct WOLFSSL_TXT_DB { long error; long arg1; long arg2; - wolf_sk_compare_cb comp[WOLFSSL_TXT_DB_MAX_FIELDS]; wolf_sk_hash_cb hash_fn[WOLFSSL_TXT_DB_MAX_FIELDS]; }; typedef struct WOLFSSL_TXT_DB WOLFSSL_TXT_DB; +typedef int (*wolf_lh_compare_cb)(const void* a, + const void* b); WOLFSSL_API WOLFSSL_TXT_DB *wolfSSL_TXT_DB_read(WOLFSSL_BIO *in, int num); WOLFSSL_API long wolfSSL_TXT_DB_write(WOLFSSL_BIO *out, WOLFSSL_TXT_DB *db); WOLFSSL_API int wolfSSL_TXT_DB_insert(WOLFSSL_TXT_DB *db, WOLFSSL_STRING *row); WOLFSSL_API void wolfSSL_TXT_DB_free(WOLFSSL_TXT_DB *db); WOLFSSL_API int wolfSSL_TXT_DB_create_index(WOLFSSL_TXT_DB *db, int field, - void* qual, wolf_sk_hash_cb hash, wolf_sk_compare_cb cmp); + void* qual, wolf_sk_hash_cb hash, wolf_lh_compare_cb cmp); WOLFSSL_API WOLFSSL_STRING *wolfSSL_TXT_DB_get_by_index(WOLFSSL_TXT_DB *db, int idx, WOLFSSL_STRING *value); diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 92271de8c..662887d09 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -4577,17 +4577,17 @@ WOLFSSL_API void wolfSSL_sk_X509_INFO_pop_free(WOLF_STACK_OF(WOLFSSL_X509_INFO)* void (*f) (WOLFSSL_X509_INFO*)); WOLFSSL_API void wolfSSL_sk_X509_INFO_free(WOLF_STACK_OF(WOLFSSL_X509_INFO)*); -typedef int (*wolf_sk_compare_cb)(const void* a, - const void* b); +#define WOLF_SK_COMPARE_CB(type, arg) \ + int (*arg) (const type* const* a, const type* const* b) typedef unsigned long (*wolf_sk_hash_cb) (const void *v); WOLFSSL_API WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_sk_X509_NAME_new( - wolf_sk_compare_cb cb); + WOLF_SK_COMPARE_CB(WOLFSSL_X509_NAME, cb)); WOLFSSL_API int wolfSSL_sk_X509_NAME_push(WOLF_STACK_OF(WOLFSSL_X509_NAME)*, WOLFSSL_X509_NAME* name); WOLFSSL_API int wolfSSL_sk_X509_NAME_find(const WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk, WOLFSSL_X509_NAME* name); WOLFSSL_API int wolfSSL_sk_X509_NAME_set_cmp_func( - WOLF_STACK_OF(WOLFSSL_X509_NAME)*, wolf_sk_compare_cb cb); + WOLF_STACK_OF(WOLFSSL_X509_NAME)*, WOLF_SK_COMPARE_CB(WOLFSSL_X509_NAME, cb)); WOLFSSL_API WOLFSSL_X509_NAME* wolfSSL_sk_X509_NAME_value(const WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk, int i); WOLFSSL_API int wolfSSL_sk_X509_NAME_num(const WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk); WOLFSSL_API WOLFSSL_X509_NAME* wolfSSL_sk_X509_NAME_pop(WOLF_STACK_OF(WOLFSSL_X509_NAME)*); @@ -4596,7 +4596,7 @@ WOLFSSL_API void wolfSSL_sk_X509_NAME_pop_free(WOLF_STACK_OF(WOLFSSL_X509_NAME)* WOLFSSL_API void wolfSSL_sk_X509_NAME_free(WOLF_STACK_OF(WOLFSSL_X509_NAME) *); WOLFSSL_API WOLF_STACK_OF(WOLFSSL_X509_NAME_ENTRY)* - wolfSSL_sk_X509_NAME_ENTRY_new(wolf_sk_compare_cb cb); + wolfSSL_sk_X509_NAME_ENTRY_new(WOLF_SK_COMPARE_CB(WOLFSSL_X509_NAME_ENTRY, cb)); WOLFSSL_API int wolfSSL_sk_X509_NAME_ENTRY_push(WOLF_STACK_OF(WOLFSSL_X509_NAME_ENTRY)* sk, WOLFSSL_X509_NAME_ENTRY* name_entry); WOLFSSL_API WOLFSSL_X509_NAME_ENTRY* @@ -4614,7 +4614,7 @@ WOLFSSL_API int wolfSSL_X509_NAME_print_ex_fp(XFILE fp,WOLFSSL_X509_NAME* name,i unsigned long flags); #endif -WOLFSSL_API WOLFSSL_STACK *wolfSSL_sk_CONF_VALUE_new(wolf_sk_compare_cb compFunc); +WOLFSSL_API WOLFSSL_STACK *wolfSSL_sk_CONF_VALUE_new(WOLF_SK_COMPARE_CB(WOLFSSL_CONF_VALUE, compFunc)); WOLFSSL_API void wolfSSL_sk_CONF_VALUE_free(struct WOLFSSL_STACK *sk); WOLFSSL_API int wolfSSL_sk_CONF_VALUE_num(const WOLFSSL_STACK *sk); WOLFSSL_API WOLFSSL_CONF_VALUE *wolfSSL_sk_CONF_VALUE_value(