From 1ea6472e604ed0e411fa41fcb5f242729ee42cd6 Mon Sep 17 00:00:00 2001 From: Ben Laurie Date: Tue, 14 Oct 2008 08:10:52 +0000 Subject: [PATCH] Type-safe OBJ_bsearch_ex. --- CHANGES | 6 +++++- crypto/objects/obj_dat.c | 8 +++++--- crypto/objects/objects.h | 14 +++++++++++--- crypto/stack/safestack.h | 2 +- crypto/stack/stack.c | 28 ++++++++++------------------ crypto/stack/stack.h | 9 ++++----- 6 files changed, 36 insertions(+), 31 deletions(-) diff --git a/CHANGES b/CHANGES index 0a087c149d..509f1a0e7f 100644 --- a/CHANGES +++ b/CHANGES @@ -4,10 +4,14 @@ Changes between 0.9.8j and 0.9.9 [xx XXX xxxx] + *) Type-checked OBJ_bsearch_ex. + [Ben Laurie] + *) Type-checked OBJ_bsearch. Also some constification necessitated by type-checking. Still to come: TXT_DB, bsearch(?), OBJ_bsearch_ex, qsort, CRYPTO_EX_DATA, ASN1_VALUE, ASN1_STRING, - CONF_VALUE. [Ben Laurie] + CONF_VALUE. + [Ben Laurie] *) New function OPENSSL_gmtime_adj() to add a specific number of days and seconds to a tm structure directly, instead of going through OS diff --git a/crypto/objects/obj_dat.c b/crypto/objects/obj_dat.c index acb6bcfb06..2f41aaeb0f 100644 --- a/crypto/objects/obj_dat.c +++ b/crypto/objects/obj_dat.c @@ -678,11 +678,13 @@ int OBJ_sn2nid(const char *s) const void *OBJ_bsearch_(const void *key, const void *base, int num, int size, int (*cmp)(const void *, const void *)) { - return OBJ_bsearch_ex(key, base, num, size, cmp, 0); + return OBJ_bsearch_ex_(key, base, num, size, cmp, 0); } -const void *OBJ_bsearch_ex(const void *key, const void *base_, int num, - int size, int (*cmp)(const void *, const void *), int flags) +const void *OBJ_bsearch_ex_(const void *key, const void *base_, int num, + int size, + int (*cmp)(const void *, const void *), + int flags) { const char *base=base_; int l,h,i=0,c=0; diff --git a/crypto/objects/objects.h b/crypto/objects/objects.h index 7dc1bf5f00..ecbe03c2d9 100644 --- a/crypto/objects/objects.h +++ b/crypto/objects/objects.h @@ -1013,9 +1013,10 @@ int OBJ_sn2nid(const char *s); int OBJ_cmp(const ASN1_OBJECT *a,const ASN1_OBJECT *b); const void * OBJ_bsearch_(const void *key,const void *base,int num,int size, int (*cmp)(const void *, const void *)); -const void * OBJ_bsearch_ex(const void *key,const void *base,int num, - int size, int (*cmp)(const void *, const void *), - int flags); +const void * OBJ_bsearch_ex_(const void *key,const void *base,int num, + int size, + int (*cmp)(const void *, const void *), + int flags); #define _DECLARE_OBJ_BSEARCH_CMP_FN(scope, type1, type2, cmp) \ scope type1 *cmp##_type_1; \ @@ -1074,6 +1075,13 @@ const void * OBJ_bsearch_ex(const void *key,const void *base,int num, cmp##_type_2=CHECKED_PTR_OF(type2,cmp##_type_2), \ cmp##_BSEARCH_CMP_FN))) +#define OBJ_bsearch_ex(type1,key,type2,base,num,cmp,flags) \ + ((type2 *)OBJ_bsearch_(CHECKED_PTR_OF(type1,key),CHECKED_PTR_OF(type2,base), \ + num,sizeof(type2), \ + (cmp##_type_1=CHECKED_PTR_OF(type1,cmp##_type_1), \ + cmp##_type_2=CHECKED_PTR_OF(type2,cmp##_type_2), \ + cmp##_BSEARCH_CMP_FN)),flags) + int OBJ_new_nid(int num); int OBJ_add_object(const ASN1_OBJECT *obj); int OBJ_create(const char *oid,const char *sn,const char *ln); diff --git a/crypto/stack/safestack.h b/crypto/stack/safestack.h index 9ed5fc21e7..58597c4479 100644 --- a/crypto/stack/safestack.h +++ b/crypto/stack/safestack.h @@ -69,7 +69,7 @@ ((void (*)(void *)) ((1 ? p : (void (*)(type))0))) #define CHECKED_SK_CMP_FUNC(type, p) \ - ((int (*)(const void * const *, const void * const *)) \ + ((int (*)(const void *, const void *)) \ ((1 ? p : (int (*)(const type * const *, const type * const *))0))) #define STACK_OF(type) struct stack_st_##type diff --git a/crypto/stack/stack.c b/crypto/stack/stack.c index a58229a18c..76cf1a1168 100644 --- a/crypto/stack/stack.c +++ b/crypto/stack/stack.c @@ -77,11 +77,10 @@ const char STACK_version[]="Stack" OPENSSL_VERSION_PTEXT; #include -int (*sk_set_cmp_func(_STACK *sk, int (*c)(const void * const *, - const void * const *))) - (const void * const *, const void * const *) +int (*sk_set_cmp_func(_STACK *sk, int (*c)(const void *, const void *))) + (const void *, const void *) { - int (*old)(const void * const *,const void * const *)=sk->comp; + int (*old)(const void *,const void *)=sk->comp; if (sk->comp != c) sk->sorted=0; @@ -115,10 +114,10 @@ err: _STACK *sk_new_null(void) { - return sk_new((int (*)(const void * const *, const void * const *))0); + return sk_new((int (*)(const void *, const void *))0); } -_STACK *sk_new(int (*c)(const void * const *, const void * const *)) +_STACK *sk_new(int (*c)(const void *, const void *)) { _STACK *ret; int i; @@ -213,9 +212,9 @@ void *sk_delete(_STACK *st, int loc) static int internal_find(_STACK *st, void *data, int ret_val_options) { - char **r; + const void * const *r; int i; - int (*comp_func)(const void *,const void *); + if(st == NULL) return -1; if (st->comp == NULL) @@ -227,17 +226,10 @@ static int internal_find(_STACK *st, void *data, int ret_val_options) } sk_sort(st); if (data == NULL) return(-1); - /* This (and the "qsort" below) are the two places in OpenSSL - * where we need to convert from our standard (type **,type **) - * compare callback type to the (void *,void *) type required by - * bsearch. However, the "data" it is being called(back) with are - * not (type *) pointers, but the *pointers* to (type *) pointers, - * so we get our extra level of pointer dereferencing that way. */ - comp_func=(int (*)(const void *,const void *))(st->comp); - r=(char **)OBJ_bsearch_ex((char *)&data,(char *)st->data, - st->num,sizeof(char *),comp_func,ret_val_options); + r=OBJ_bsearch_ex_(&data,st->data,st->num,sizeof(void *),st->comp, + ret_val_options); if (r == NULL) return(-1); - return((int)(r-st->data)); + return (int)((char **)r-st->data); } int sk_find(_STACK *st, void *data) diff --git a/crypto/stack/stack.h b/crypto/stack/stack.h index 70f78aa743..ce35e554eb 100644 --- a/crypto/stack/stack.h +++ b/crypto/stack/stack.h @@ -70,7 +70,7 @@ typedef struct stack_st int sorted; int num_alloc; - int (*comp)(const void * const *, const void * const *); + int (*comp)(const void *, const void *); } _STACK; /* Use STACK_OF(...) instead */ #define M_sk_num(sk) ((sk) ? (sk)->num:-1) @@ -81,7 +81,7 @@ void *sk_value(const _STACK *, int); void *sk_set(_STACK *, int, void *); -_STACK *sk_new(int (*cmp)(const void * const *, const void * const *)); +_STACK *sk_new(int (*cmp)(const void *, const void *)); _STACK *sk_new_null(void); void sk_free(_STACK *); void sk_pop_free(_STACK *st, void (*func)(void *)); @@ -95,9 +95,8 @@ int sk_unshift(_STACK *st, void *data); void *sk_shift(_STACK *st); void *sk_pop(_STACK *st); void sk_zero(_STACK *st); -int (*sk_set_cmp_func(_STACK *sk, int (*c)(const void * const *, - const void * const *))) - (const void * const *, const void * const *); +int (*sk_set_cmp_func(_STACK *sk, int (*c)(const void *, const void *))) + (const void *, const void *); _STACK *sk_dup(_STACK *st); void sk_sort(_STACK *st); int sk_is_sorted(const _STACK *st); -- 2.25.1