diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/stack/stack.c | 73 |
1 files changed, 47 insertions, 26 deletions
diff --git a/src/lib/libcrypto/stack/stack.c b/src/lib/libcrypto/stack/stack.c index 58e9126339..02857f0446 100644 --- a/src/lib/libcrypto/stack/stack.c +++ b/src/lib/libcrypto/stack/stack.c | |||
| @@ -74,12 +74,12 @@ | |||
| 74 | 74 | ||
| 75 | const char *STACK_version="Stack" OPENSSL_VERSION_PTEXT; | 75 | const char *STACK_version="Stack" OPENSSL_VERSION_PTEXT; |
| 76 | 76 | ||
| 77 | #define FP_ICC (int (*)(const void *,const void *)) | ||
| 78 | #include <errno.h> | 77 | #include <errno.h> |
| 79 | 78 | ||
| 80 | int (*sk_set_cmp_func(STACK *sk, int (*c)()))(void) | 79 | int (*sk_set_cmp_func(STACK *sk, int (*c)(const char * const *,const char * const *))) |
| 80 | (const char * const *, const char * const *) | ||
| 81 | { | 81 | { |
| 82 | int (*old)()=sk->comp; | 82 | int (*old)(const char * const *,const char * const *)=sk->comp; |
| 83 | 83 | ||
| 84 | if (sk->comp != c) | 84 | if (sk->comp != c) |
| 85 | sk->sorted=0; | 85 | sk->sorted=0; |
| @@ -94,7 +94,7 @@ STACK *sk_dup(STACK *sk) | |||
| 94 | char **s; | 94 | char **s; |
| 95 | 95 | ||
| 96 | if ((ret=sk_new(sk->comp)) == NULL) goto err; | 96 | if ((ret=sk_new(sk->comp)) == NULL) goto err; |
| 97 | s=(char **)Realloc((char *)ret->data, | 97 | s=(char **)OPENSSL_realloc((char *)ret->data, |
| 98 | (unsigned int)sizeof(char *)*sk->num_alloc); | 98 | (unsigned int)sizeof(char *)*sk->num_alloc); |
| 99 | if (s == NULL) goto err; | 99 | if (s == NULL) goto err; |
| 100 | ret->data=s; | 100 | ret->data=s; |
| @@ -109,14 +109,19 @@ err: | |||
| 109 | return(NULL); | 109 | return(NULL); |
| 110 | } | 110 | } |
| 111 | 111 | ||
| 112 | STACK *sk_new(int (*c)()) | 112 | STACK *sk_new_null(void) |
| 113 | { | ||
| 114 | return sk_new((int (*)(const char * const *, const char * const *))0); | ||
| 115 | } | ||
| 116 | |||
| 117 | STACK *sk_new(int (*c)(const char * const *, const char * const *)) | ||
| 113 | { | 118 | { |
| 114 | STACK *ret; | 119 | STACK *ret; |
| 115 | int i; | 120 | int i; |
| 116 | 121 | ||
| 117 | if ((ret=(STACK *)Malloc(sizeof(STACK))) == NULL) | 122 | if ((ret=(STACK *)OPENSSL_malloc(sizeof(STACK))) == NULL) |
| 118 | goto err0; | 123 | goto err0; |
| 119 | if ((ret->data=(char **)Malloc(sizeof(char *)*MIN_NODES)) == NULL) | 124 | if ((ret->data=(char **)OPENSSL_malloc(sizeof(char *)*MIN_NODES)) == NULL) |
| 120 | goto err1; | 125 | goto err1; |
| 121 | for (i=0; i<MIN_NODES; i++) | 126 | for (i=0; i<MIN_NODES; i++) |
| 122 | ret->data[i]=NULL; | 127 | ret->data[i]=NULL; |
| @@ -126,7 +131,7 @@ STACK *sk_new(int (*c)()) | |||
| 126 | ret->sorted=0; | 131 | ret->sorted=0; |
| 127 | return(ret); | 132 | return(ret); |
| 128 | err1: | 133 | err1: |
| 129 | Free(ret); | 134 | OPENSSL_free(ret); |
| 130 | err0: | 135 | err0: |
| 131 | return(NULL); | 136 | return(NULL); |
| 132 | } | 137 | } |
| @@ -138,7 +143,7 @@ int sk_insert(STACK *st, char *data, int loc) | |||
| 138 | if(st == NULL) return 0; | 143 | if(st == NULL) return 0; |
| 139 | if (st->num_alloc <= st->num+1) | 144 | if (st->num_alloc <= st->num+1) |
| 140 | { | 145 | { |
| 141 | s=(char **)Realloc((char *)st->data, | 146 | s=(char **)OPENSSL_realloc((char *)st->data, |
| 142 | (unsigned int)sizeof(char *)*st->num_alloc*2); | 147 | (unsigned int)sizeof(char *)*st->num_alloc*2); |
| 143 | if (s == NULL) | 148 | if (s == NULL) |
| 144 | return(0); | 149 | return(0); |
| @@ -207,7 +212,7 @@ int sk_find(STACK *st, char *data) | |||
| 207 | { | 212 | { |
| 208 | char **r; | 213 | char **r; |
| 209 | int i; | 214 | int i; |
| 210 | int (*comp_func)(); | 215 | int (*comp_func)(const void *,const void *); |
| 211 | if(st == NULL) return -1; | 216 | if(st == NULL) return -1; |
| 212 | 217 | ||
| 213 | if (st->comp == NULL) | 218 | if (st->comp == NULL) |
| @@ -219,13 +224,24 @@ int sk_find(STACK *st, char *data) | |||
| 219 | } | 224 | } |
| 220 | sk_sort(st); | 225 | sk_sort(st); |
| 221 | if (data == NULL) return(-1); | 226 | if (data == NULL) return(-1); |
| 222 | comp_func=(int (*)())st->comp; | 227 | /* This (and the "qsort" below) are the two places in OpenSSL |
| 228 | * where we need to convert from our standard (type **,type **) | ||
| 229 | * compare callback type to the (void *,void *) type required by | ||
| 230 | * bsearch. However, the "data" it is being called(back) with are | ||
| 231 | * not (type *) pointers, but the *pointers* to (type *) pointers, | ||
| 232 | * so we get our extra level of pointer dereferencing that way. */ | ||
| 233 | comp_func=(int (*)(const void *,const void *))(st->comp); | ||
| 223 | r=(char **)bsearch(&data,(char *)st->data, | 234 | r=(char **)bsearch(&data,(char *)st->data, |
| 224 | st->num,sizeof(char *),FP_ICC comp_func); | 235 | st->num,sizeof(char *), comp_func); |
| 225 | if (r == NULL) return(-1); | 236 | if (r == NULL) return(-1); |
| 226 | i=(int)(r-st->data); | 237 | i=(int)(r-st->data); |
| 227 | for ( ; i>0; i--) | 238 | for ( ; i>0; i--) |
| 228 | if ((*st->comp)(&(st->data[i-1]),&data) < 0) | 239 | /* This needs a cast because the type being pointed to from |
| 240 | * the "&" expressions are (char *) rather than (const char *). | ||
| 241 | * For an explanation, read: | ||
| 242 | * http://www.eskimo.com/~scs/C-faq/q11.10.html :-) */ | ||
| 243 | if ((*st->comp)((const char * const *)&(st->data[i-1]), | ||
| 244 | (const char * const *)&data) < 0) | ||
| 229 | break; | 245 | break; |
| 230 | return(i); | 246 | return(i); |
| 231 | } | 247 | } |
| @@ -262,7 +278,7 @@ void sk_zero(STACK *st) | |||
| 262 | st->num=0; | 278 | st->num=0; |
| 263 | } | 279 | } |
| 264 | 280 | ||
| 265 | void sk_pop_free(STACK *st, void (*func)()) | 281 | void sk_pop_free(STACK *st, void (*func)(void *)) |
| 266 | { | 282 | { |
| 267 | int i; | 283 | int i; |
| 268 | 284 | ||
| @@ -276,17 +292,17 @@ void sk_pop_free(STACK *st, void (*func)()) | |||
| 276 | void sk_free(STACK *st) | 292 | void sk_free(STACK *st) |
| 277 | { | 293 | { |
| 278 | if (st == NULL) return; | 294 | if (st == NULL) return; |
| 279 | if (st->data != NULL) Free(st->data); | 295 | if (st->data != NULL) OPENSSL_free(st->data); |
| 280 | Free(st); | 296 | OPENSSL_free(st); |
| 281 | } | 297 | } |
| 282 | 298 | ||
| 283 | int sk_num(STACK *st) | 299 | int sk_num(const STACK *st) |
| 284 | { | 300 | { |
| 285 | if(st == NULL) return -1; | 301 | if(st == NULL) return -1; |
| 286 | return st->num; | 302 | return st->num; |
| 287 | } | 303 | } |
| 288 | 304 | ||
| 289 | char *sk_value(STACK *st, int i) | 305 | char *sk_value(const STACK *st, int i) |
| 290 | { | 306 | { |
| 291 | if(st == NULL) return NULL; | 307 | if(st == NULL) return NULL; |
| 292 | return st->data[i]; | 308 | return st->data[i]; |
| @@ -299,13 +315,18 @@ char *sk_set(STACK *st, int i, char *value) | |||
| 299 | } | 315 | } |
| 300 | 316 | ||
| 301 | void sk_sort(STACK *st) | 317 | void sk_sort(STACK *st) |
| 302 | { | ||
| 303 | if (!st->sorted) | ||
| 304 | { | 318 | { |
| 305 | int (*comp_func)(); | 319 | if (!st->sorted) |
| 306 | 320 | { | |
| 307 | comp_func=(int (*)())st->comp; | 321 | int (*comp_func)(const void *,const void *); |
| 308 | qsort(st->data,st->num,sizeof(char *),FP_ICC comp_func); | 322 | |
| 309 | st->sorted=1; | 323 | /* same comment as in sk_find ... previously st->comp was declared |
| 324 | * as a (void*,void*) callback type, but this made the population | ||
| 325 | * of the callback pointer illogical - our callbacks compare | ||
| 326 | * type** with type**, so we leave the casting until absolutely | ||
| 327 | * necessary (ie. "now"). */ | ||
| 328 | comp_func=(int (*)(const void *,const void *))(st->comp); | ||
| 329 | qsort(st->data,st->num,sizeof(char *), comp_func); | ||
| 330 | st->sorted=1; | ||
| 331 | } | ||
| 310 | } | 332 | } |
| 311 | } | ||
