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.
pull/5571/head
Juliusz Sosinowicz 2022-09-08 11:55:32 +02:00
parent 4066568315
commit 28af88788a
7 changed files with 28 additions and 62 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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 */

View File

@ -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));

View File

@ -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

View File

@ -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);

View File

@ -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(