Type-safe OBJ_bsearch_ex.
authorBen Laurie <ben@openssl.org>
Tue, 14 Oct 2008 08:10:52 +0000 (08:10 +0000)
committerBen Laurie <ben@openssl.org>
Tue, 14 Oct 2008 08:10:52 +0000 (08:10 +0000)
CHANGES
crypto/objects/obj_dat.c
crypto/objects/objects.h
crypto/stack/safestack.h
crypto/stack/stack.c
crypto/stack/stack.h

diff --git a/CHANGES b/CHANGES
index 0a087c1..509f1a0 100644 (file)
--- 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
index acb6bcf..2f41aae 100644 (file)
@@ -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;
index 7dc1bf5..ecbe03c 100644 (file)
@@ -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);
index 9ed5fc2..58597c4 100644 (file)
@@ -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
index a58229a..76cf1a1 100644 (file)
@@ -77,11 +77,10 @@ const char STACK_version[]="Stack" OPENSSL_VERSION_PTEXT;
 
 #include <errno.h>
 
-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)
index 70f78aa..ce35e55 100644 (file)
@@ -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);