summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/stack/stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/stack/stack.c')
-rw-r--r--src/lib/libcrypto/stack/stack.c73
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
75const char *STACK_version="Stack" OPENSSL_VERSION_PTEXT; 75const 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
80int (*sk_set_cmp_func(STACK *sk, int (*c)()))(void) 79int (*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
112STACK *sk_new(int (*c)()) 112STACK *sk_new_null(void)
113 {
114 return sk_new((int (*)(const char * const *, const char * const *))0);
115 }
116
117STACK *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);
128err1: 133err1:
129 Free(ret); 134 OPENSSL_free(ret);
130err0: 135err0:
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
265void sk_pop_free(STACK *st, void (*func)()) 281void 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)())
276void sk_free(STACK *st) 292void 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
283int sk_num(STACK *st) 299int 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
289char *sk_value(STACK *st, int i) 305char *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
301void sk_sort(STACK *st) 317void 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 }