X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=crypto%2Fconf%2Fconf_api.c;h=0032baa7119b2e250ec08b4bbc0db66a4b2cce8d;hb=ff90d659e65c0175787f7f964f3a0b96a029a1f8;hp=29989270ab2c5a7c777791a0050d6c8c38916d16;hpb=21346b7a04f68c97347488078deda4b175a8672b;p=oweals%2Fopenssl.git diff --git a/crypto/conf/conf_api.c b/crypto/conf/conf_api.c index 29989270ab..0032baa711 100644 --- a/crypto/conf/conf_api.c +++ b/crypto/conf/conf_api.c @@ -58,28 +58,43 @@ /* Part of the code in here was originally in conf.c, which is now removed */ +#ifndef CONF_DEBUG +# undef NDEBUG /* avoid conflicting definitions */ +# define NDEBUG +#endif + +#include +#include #include #include +#include "e_os.h" static void value_free_hash(CONF_VALUE *a, LHASH *conf); static void value_free_stack(CONF_VALUE *a,LHASH *conf); -static unsigned long hash(CONF_VALUE *v); -static int cmp_conf(CONF_VALUE *a,CONF_VALUE *b); +static IMPLEMENT_LHASH_DOALL_ARG_FN(value_free_hash, CONF_VALUE *, LHASH *) +static IMPLEMENT_LHASH_DOALL_ARG_FN(value_free_stack, CONF_VALUE *, LHASH *) +/* We don't use function pointer casting or wrapper functions - but cast each + * callback parameter inside the callback functions. */ +/* static unsigned long hash(CONF_VALUE *v); */ +static unsigned long hash(const void *v_void); +/* static int cmp_conf(CONF_VALUE *a,CONF_VALUE *b); */ +static int cmp_conf(const void *a_void,const void *b_void); /* Up until OpenSSL 0.9.5a, this was get_section */ -CONF_VALUE *_CONF_get_section(CONF *conf, char *section) +CONF_VALUE *_CONF_get_section(const CONF *conf, const char *section) { CONF_VALUE *v,vv; if ((conf == NULL) || (section == NULL)) return(NULL); vv.name=NULL; - vv.section=section; + vv.section=(char *)section; v=(CONF_VALUE *)lh_retrieve(conf->data,&vv); return(v); } /* Up until OpenSSL 0.9.5a, this was CONF_get_section */ -STACK_OF(CONF_VALUE) *_CONF_get_section_values(CONF *conf, char *section) +STACK_OF(CONF_VALUE) *_CONF_get_section_values(const CONF *conf, + const char *section) { CONF_VALUE *v; @@ -107,14 +122,14 @@ int _CONF_add_string(CONF *conf, CONF_VALUE *section, CONF_VALUE *value) if (v != NULL) { sk_CONF_VALUE_delete_ptr(ts,v); - Free(v->name); - Free(v->value); - Free(v); + OPENSSL_free(v->name); + OPENSSL_free(v->value); + OPENSSL_free(v); } return 1; } -char *_CONF_get_string(CONF *conf, char *section, char *name) +char *_CONF_get_string(const CONF *conf, const char *section, const char *name) { CONF_VALUE *v,vv; char *p; @@ -124,8 +139,8 @@ char *_CONF_get_string(CONF *conf, char *section, char *name) { if (section != NULL) { - vv.name=name; - vv.section=section; + vv.name=(char *)name; + vv.section=(char *)section; v=(CONF_VALUE *)lh_retrieve(conf->data,&vv); if (v != NULL) return(v->value); if (strcmp(section,"ENV") == 0) @@ -135,7 +150,7 @@ char *_CONF_get_string(CONF *conf, char *section, char *name) } } vv.section="default"; - vv.name=name; + vv.name=(char *)name; v=(CONF_VALUE *)lh_retrieve(conf->data,&vv); if (v != NULL) return(v->value); @@ -146,6 +161,9 @@ char *_CONF_get_string(CONF *conf, char *section, char *name) return(Getenv(name)); } +#if 0 /* There's no way to provide error checking with this function, so + force implementors of the higher levels to get a string and read + the number themselves. */ long _CONF_get_number(CONF *conf, char *section, char *name) { char *str; @@ -162,6 +180,7 @@ long _CONF_get_number(CONF *conf, char *section, char *name) str++; } } +#endif int _CONF_new_data(CONF *conf) { @@ -170,7 +189,7 @@ int _CONF_new_data(CONF *conf) return 0; } if (conf->data == NULL) - if ((conf->data = lh_new(hash,cmp_conf)) == NULL) + if ((conf->data = lh_new(hash, cmp_conf)) == NULL) { return 0; } @@ -181,14 +200,16 @@ void _CONF_free_data(CONF *conf) { if (conf == NULL || conf->data == NULL) return; - conf->data->down_load=0; /* evil thing to make sure the 'Free()' + conf->data->down_load=0; /* evil thing to make sure the 'OPENSSL_free()' * works as expected */ - lh_doall_arg(conf->data,(void (*)())value_free_hash,conf->data); + lh_doall_arg(conf->data, LHASH_DOALL_ARG_FN(value_free_hash), + conf->data); /* We now have only 'section' entries in the hash table. * Due to problems with */ - lh_doall_arg(conf->data,(void (*)())value_free_stack,conf->data); + lh_doall_arg(conf->data, LHASH_DOALL_ARG_FN(value_free_stack), + conf->data); lh_free(conf->data); } @@ -212,23 +233,28 @@ static void value_free_stack(CONF_VALUE *a, LHASH *conf) for (i=sk_num(sk)-1; i>=0; i--) { vv=(CONF_VALUE *)sk_value(sk,i); - Free(vv->value); - Free(vv->name); - Free(vv); + OPENSSL_free(vv->value); + OPENSSL_free(vv->name); + OPENSSL_free(vv); } if (sk != NULL) sk_free(sk); - Free(a->section); - Free(a); + OPENSSL_free(a->section); + OPENSSL_free(a); } -static unsigned long hash(CONF_VALUE *v) +/* static unsigned long hash(CONF_VALUE *v) */ +static unsigned long hash(const void *v_void) { + CONF_VALUE *v = (CONF_VALUE *)v_void; return((lh_strhash(v->section)<<2)^lh_strhash(v->name)); } -static int cmp_conf(CONF_VALUE *a, CONF_VALUE *b) +/* static int cmp_conf(CONF_VALUE *a, CONF_VALUE *b) */ +static int cmp_conf(const void *a_void,const void *b_void) { int i; + CONF_VALUE *a = (CONF_VALUE *)a_void; + CONF_VALUE *b = (CONF_VALUE *)b_void; if (a->section != b->section) { @@ -248,7 +274,7 @@ static int cmp_conf(CONF_VALUE *a, CONF_VALUE *b) } /* Up until OpenSSL 0.9.5a, this was new_section */ -CONF_VALUE *_CONF_new_section(CONF *conf, char *section) +CONF_VALUE *_CONF_new_section(CONF *conf, const char *section) { STACK *sk=NULL; int ok=0,i; @@ -256,10 +282,10 @@ CONF_VALUE *_CONF_new_section(CONF *conf, char *section) if ((sk=sk_new_null()) == NULL) goto err; - if ((v=(CONF_VALUE *)Malloc(sizeof(CONF_VALUE))) == NULL) + if ((v=(CONF_VALUE *)OPENSSL_malloc(sizeof(CONF_VALUE))) == NULL) goto err; i=strlen(section)+1; - if ((v->section=(char *)Malloc(i)) == NULL) + if ((v->section=(char *)OPENSSL_malloc(i)) == NULL) goto err; memcpy(v->section,section,i); @@ -267,19 +293,13 @@ CONF_VALUE *_CONF_new_section(CONF *conf, char *section) v->value=(char *)sk; vv=(CONF_VALUE *)lh_insert(conf->data,v); - if (vv != NULL) - { -#if !defined(NO_STDIO) && !defined(WIN16) - fprintf(stderr,"internal fault\n"); -#endif - abort(); - } + assert(vv == NULL); ok=1; err: if (!ok) { if (sk != NULL) sk_free(sk); - if (v != NULL) Free(v); + if (v != NULL) OPENSSL_free(v); v=NULL; } return(v);