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, 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"); WOLFSSL_ENTER("wolfSSL_TXT_DB_create_index");
(void)qual; (void)qual;
(void)cmp;
if (!db || !hash || !cmp || field >= db->num_fields || field < 0) { if (!db || !hash || !cmp || field >= db->num_fields || field < 0) {
WOLFSSL_MSG("Bad parameter"); 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->hash_fn[field] = hash;
db->comp[field] = cmp;
return WOLFSSL_SUCCESS; return WOLFSSL_SUCCESS;
} }
@ -274,21 +274,18 @@ WOLFSSL_STRING *wolfSSL_TXT_DB_get_by_index(WOLFSSL_TXT_DB *db, int idx,
return NULL; return NULL;
} }
if (!db->hash_fn[idx] || !db->comp[idx]) { if (!db->hash_fn[idx]) {
WOLFSSL_MSG("Missing hash or cmp functions"); WOLFSSL_MSG("Missing hash functions");
return NULL; return NULL;
} }
/* If first data struct has correct hash and cmp function then /* If first data struct has correct hash function
* assume others do too */ * then assume others do too */
if (db->data->hash_fn != db->hash_fn[idx] || if (db->data->hash_fn != db->hash_fn[idx]) {
db->data->comp != db->comp[idx]) {
/* Set the hash and comp functions */ /* Set the hash and comp functions */
WOLF_STACK_OF(WOLFSSL_STRING)* data = db->data; WOLF_STACK_OF(WOLFSSL_STRING)* data = db->data;
while (data) { while (data) {
if (data->comp != db->comp[idx] || if (data->hash_fn != db->hash_fn[idx]) {
data->hash_fn != db->hash_fn[idx]) {
data->comp = db->comp[idx];
data->hash_fn = db->hash_fn[idx]; data->hash_fn = db->hash_fn[idx];
data->hash = 0; data->hash = 0;
} }
@ -333,32 +330,6 @@ static unsigned long wolfSSL_CONF_VALUE_hash(const WOLFSSL_CONF_VALUE *val)
return 0; 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 /* 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 * "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 * 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_STACK* ret;
WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_new"); WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_new");
ret = wolfSSL_sk_new_node(NULL); ret = wolfSSL_sk_new_node(NULL);
if (!ret) if (!ret)
return NULL; 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->hash_fn = (wolf_sk_hash_cb)wolfSSL_CONF_VALUE_hash;
ret->type = STACK_TYPE_CONF_VALUE; ret->type = STACK_TYPE_CONF_VALUE;
(void)compFunc;
return ret; return ret;
} }

View File

@ -19312,7 +19312,6 @@ int wolfSSL_sk_push(WOLFSSL_STACK* sk, const void *data)
sk->num += 1; sk->num += 1;
#ifdef OPENSSL_ALL #ifdef OPENSSL_ALL
node->comp = sk->comp;
node->hash_fn = sk->hash_fn; node->hash_fn = sk->hash_fn;
node->hash = sk->hash; node->hash = sk->hash;
sk->hash = 0; sk->hash = 0;

View File

@ -11542,7 +11542,8 @@ error:
defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \ defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \
defined(WOLFSSL_OPENSSH) || defined(HAVE_SBLIM_SFCB) 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; WOLFSSL_STACK* sk;
(void)cb; (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); sk = wolfSSL_sk_new_node(NULL);
if (sk != NULL) { if (sk != NULL) {
sk->type = STACK_TYPE_X509_NAME; sk->type = STACK_TYPE_X509_NAME;
#ifdef OPENSSL_ALL
sk->comp = cb;
#endif
} }
return sk; return sk;
@ -11656,16 +11654,12 @@ int wolfSSL_sk_X509_NAME_find(const WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk,
/* Name Entry */ /* Name Entry */
WOLF_STACK_OF(WOLFSSL_X509_NAME_ENTRY)* wolfSSL_sk_X509_NAME_ENTRY_new( 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); WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
if (sk != NULL) { if (sk != NULL) {
sk->type = STACK_TYPE_X509_NAME_ENTRY; sk->type = STACK_TYPE_X509_NAME_ENTRY;
#ifdef OPENSSL_ALL
sk->comp = cb;
#else
(void)cb; (void)cb;
#endif
} }
return sk; return sk;
} }
@ -11827,7 +11821,7 @@ WOLF_STACK_OF(WOLFSSL_X509_NAME) *wolfSSL_dup_CA_list(
WOLFSSL_ENTER("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) { if (copy == NULL) {
WOLFSSL_MSG("Memory error"); WOLFSSL_MSG("Memory error");
return NULL; 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, 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"); WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_set_cmp_func");
if (sk == NULL) if (sk == NULL)
return BAD_FUNC_ARG; return BAD_FUNC_ARG;
sk->comp = cb; WOLFSSL_MSG("Stack comparison not used in wolfSSL");
(void)cb;
return 0; return 0;
} }
#endif /* OPENSSL_ALL */ #endif /* OPENSSL_ALL */

View File

@ -46674,7 +46674,7 @@ static int test_wolfSSL_TXT_DB(void)
/* Test index */ /* Test index */
AssertIntEQ(TXT_DB_create_index(db, 3, NULL, (wolf_sk_hash_cb)TXT_DB_hash, 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)); AssertNotNull(TXT_DB_get_by_index(db, 3, (WOLFSSL_STRING*)fields));
fields[3] = "12DA"; fields[3] = "12DA";
AssertNotNull(TXT_DB_get_by_index(db, 3, (WOLFSSL_STRING*)fields)); 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 unsigned long num; /* number of nodes in stack
* (safety measure for freeing and shortcut for count) */ * (safety measure for freeing and shortcut for count) */
#if defined(OPENSSL_ALL) #if defined(OPENSSL_ALL)
wolf_sk_compare_cb comp;
wolf_sk_hash_cb hash_fn; wolf_sk_hash_cb hash_fn;
unsigned long hash; unsigned long hash;
#endif #endif

View File

@ -32,18 +32,19 @@ struct WOLFSSL_TXT_DB {
long error; long error;
long arg1; long arg1;
long arg2; long arg2;
wolf_sk_compare_cb comp[WOLFSSL_TXT_DB_MAX_FIELDS];
wolf_sk_hash_cb hash_fn[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 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 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 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 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 void wolfSSL_TXT_DB_free(WOLFSSL_TXT_DB *db);
WOLFSSL_API int wolfSSL_TXT_DB_create_index(WOLFSSL_TXT_DB *db, int field, 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, WOLFSSL_API WOLFSSL_STRING *wolfSSL_TXT_DB_get_by_index(WOLFSSL_TXT_DB *db,
int idx, WOLFSSL_STRING *value); 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*)); void (*f) (WOLFSSL_X509_INFO*));
WOLFSSL_API void wolfSSL_sk_X509_INFO_free(WOLF_STACK_OF(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, #define WOLF_SK_COMPARE_CB(type, arg) \
const void* b); int (*arg) (const type* const* a, const type* const* b)
typedef unsigned long (*wolf_sk_hash_cb) (const void *v); typedef unsigned long (*wolf_sk_hash_cb) (const void *v);
WOLFSSL_API WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_sk_X509_NAME_new( 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_API int wolfSSL_sk_X509_NAME_push(WOLF_STACK_OF(WOLFSSL_X509_NAME)*,
WOLFSSL_X509_NAME* name); WOLFSSL_X509_NAME* name);
WOLFSSL_API int wolfSSL_sk_X509_NAME_find(const WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk, WOLFSSL_API int wolfSSL_sk_X509_NAME_find(const WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
WOLFSSL_X509_NAME* name); WOLFSSL_X509_NAME* name);
WOLFSSL_API int wolfSSL_sk_X509_NAME_set_cmp_func( 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 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 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)*); 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 void wolfSSL_sk_X509_NAME_free(WOLF_STACK_OF(WOLFSSL_X509_NAME) *);
WOLFSSL_API WOLF_STACK_OF(WOLFSSL_X509_NAME_ENTRY)* 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_API int wolfSSL_sk_X509_NAME_ENTRY_push(WOLF_STACK_OF(WOLFSSL_X509_NAME_ENTRY)* sk,
WOLFSSL_X509_NAME_ENTRY* name_entry); WOLFSSL_X509_NAME_ENTRY* name_entry);
WOLFSSL_API WOLFSSL_X509_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); unsigned long flags);
#endif #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 void wolfSSL_sk_CONF_VALUE_free(struct WOLFSSL_STACK *sk);
WOLFSSL_API int wolfSSL_sk_CONF_VALUE_num(const 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( WOLFSSL_API WOLFSSL_CONF_VALUE *wolfSSL_sk_CONF_VALUE_value(