X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fobjects%2Fo_names.c;h=adb5731f7659f52e3c0de19af53a26e4fee4bb4e;hp=367ee2bdef69ac4aa203ced7347f7fd20cb93157;hb=74633553a912519a6e73a9d830132e58f420a6c9;hpb=8d28d5f81b81f68a69db1c67e24bcfc092614346;ds=sidebyside diff --git a/crypto/objects/o_names.c b/crypto/objects/o_names.c index 367ee2bdef..adb5731f76 100644 --- a/crypto/objects/o_names.c +++ b/crypto/objects/o_names.c @@ -2,9 +2,22 @@ #include #include +#include #include #include #include +#include + +/* Later versions of DEC C has started to add lnkage information to certain + * functions, which makes it tricky to use them as values to regular function + * pointers. One way is to define a macro that takes care of casting them + * correctly. + */ +#ifdef OPENSSL_SYS_VMS_DECC +# define OPENSSL_strcmp (int (*)(const char *,const char *))strcmp +#else +# define OPENSSL_strcmp strcmp +#endif /* I use the ex_data stuff to manage the identifiers for the obj_name_types * that applications may define. I only really use the free function field. @@ -67,13 +80,20 @@ int OBJ_NAME_new_index(unsigned long (*hash_func)(const char *), { MemCheck_off(); name_funcs = OPENSSL_malloc(sizeof(NAME_FUNCS)); + MemCheck_on(); + if (!name_funcs) + { + OBJerr(OBJ_F_OBJ_NAME_NEW_INDEX,ERR_R_MALLOC_FAILURE); + return(0); + } name_funcs->hash_func = lh_strhash; - name_funcs->cmp_func = strcmp; + name_funcs->cmp_func = OPENSSL_strcmp; name_funcs->free_func = 0; /* NULL is often declared to * ((void *)0), which according * to Compaq C is not really * compatible with a function * pointer. -- Richard Levitte*/ + MemCheck_off(); sk_NAME_FUNCS_push(name_funcs_stack,name_funcs); MemCheck_on(); } @@ -91,8 +111,8 @@ int OBJ_NAME_new_index(unsigned long (*hash_func)(const char *), static int obj_name_cmp(const void *a_void, const void *b_void) { int ret; - OBJ_NAME *a = (OBJ_NAME *)a_void; - OBJ_NAME *b = (OBJ_NAME *)b_void; + const OBJ_NAME *a = (const OBJ_NAME *)a_void; + const OBJ_NAME *b = (const OBJ_NAME *)b_void; ret=a->type-b->type; if (ret == 0) @@ -100,8 +120,8 @@ static int obj_name_cmp(const void *a_void, const void *b_void) if ((name_funcs_stack != NULL) && (sk_NAME_FUNCS_num(name_funcs_stack) > a->type)) { - ret=sk_NAME_FUNCS_value(name_funcs_stack,a->type) - ->cmp_func(a->name,b->name); + ret=sk_NAME_FUNCS_value(name_funcs_stack, + a->type)->cmp_func(a->name,b->name); } else ret=strcmp(a->name,b->name); @@ -113,12 +133,12 @@ static int obj_name_cmp(const void *a_void, const void *b_void) static unsigned long obj_name_hash(const void *a_void) { unsigned long ret; - OBJ_NAME *a = (OBJ_NAME *)a_void; + const OBJ_NAME *a = (const OBJ_NAME *)a_void; if ((name_funcs_stack != NULL) && (sk_NAME_FUNCS_num(name_funcs_stack) > a->type)) { - ret=sk_NAME_FUNCS_value(name_funcs_stack,a->type) - ->hash_func(a->name); + ret=sk_NAME_FUNCS_value(name_funcs_stack, + a->type)->hash_func(a->name); } else { @@ -190,8 +210,8 @@ int OBJ_NAME_add(const char *name, int type, const char *data) * function should get three arguments... * -- Richard Levitte */ - sk_NAME_FUNCS_value(name_funcs_stack,ret->type) - ->free_func(ret->name,ret->type,ret->data); + sk_NAME_FUNCS_value(name_funcs_stack, + ret->type)->free_func(ret->name,ret->type,ret->data); } OPENSSL_free(ret); } @@ -225,8 +245,8 @@ int OBJ_NAME_remove(const char *name, int type) * function should get three arguments... * -- Richard Levitte */ - sk_NAME_FUNCS_value(name_funcs_stack,ret->type) - ->free_func(ret->name,ret->type,ret->data); + sk_NAME_FUNCS_value(name_funcs_stack, + ret->type)->free_func(ret->name,ret->type,ret->data); } OPENSSL_free(ret); return(1); @@ -248,6 +268,8 @@ static void do_all_fn(const OBJ_NAME *name,struct doall *d) d->fn(name,d->arg); } +static IMPLEMENT_LHASH_DOALL_ARG_FN(do_all_fn, const OBJ_NAME *, struct doall *) + void OBJ_NAME_do_all(int type,void (*fn)(const OBJ_NAME *,void *arg),void *arg) { struct doall d; @@ -256,7 +278,7 @@ void OBJ_NAME_do_all(int type,void (*fn)(const OBJ_NAME *,void *arg),void *arg) d.fn=fn; d.arg=arg; - lh_doall_arg(names_lh,(LHASH_DOALL_ARG_FN_TYPE)do_all_fn,&d); + lh_doall_arg(names_lh,LHASH_DOALL_ARG_FN(do_all_fn),&d); } struct doall_sorted @@ -295,17 +317,17 @@ void OBJ_NAME_do_all_sorted(int type,void (*fn)(const OBJ_NAME *,void *arg), d.n=0; OBJ_NAME_do_all(type,do_all_sorted_fn,&d); - qsort(d.names,d.n,sizeof *d.names,do_all_sorted_cmp); + qsort((void *)d.names,d.n,sizeof *d.names,do_all_sorted_cmp); for(n=0 ; n < d.n ; ++n) fn(d.names[n],arg); - OPENSSL_free(d.names); + OPENSSL_free((void *)d.names); } static int free_type; -static void names_lh_free(OBJ_NAME *onp, int type) +static void names_lh_free(OBJ_NAME *onp) { if(onp == NULL) return; @@ -316,6 +338,8 @@ static void names_lh_free(OBJ_NAME *onp, int type) } } +static IMPLEMENT_LHASH_DOALL_FN(names_lh_free, OBJ_NAME *) + static void name_funcs_free(NAME_FUNCS *ptr) { OPENSSL_free(ptr); @@ -331,7 +355,7 @@ void OBJ_NAME_cleanup(int type) down_load=names_lh->down_load; names_lh->down_load=0; - lh_doall(names_lh,(LHASH_DOALL_FN_TYPE)names_lh_free); + lh_doall(names_lh,LHASH_DOALL_FN(names_lh_free)); if (type < 0) { lh_free(names_lh);