diff options
Diffstat (limited to 'src/lib/libcrypto/stack/stack.c')
-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 | } | ||