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.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/src/lib/libcrypto/stack/stack.c b/src/lib/libcrypto/stack/stack.c
index c7173eb6ab..378bd7c796 100644
--- a/src/lib/libcrypto/stack/stack.c
+++ b/src/lib/libcrypto/stack/stack.c
@@ -68,11 +68,12 @@
68#include <stdio.h> 68#include <stdio.h>
69#include "cryptlib.h" 69#include "cryptlib.h"
70#include <openssl/stack.h> 70#include <openssl/stack.h>
71#include <openssl/objects.h>
71 72
72#undef MIN_NODES 73#undef MIN_NODES
73#define MIN_NODES 4 74#define MIN_NODES 4
74 75
75const char *STACK_version="Stack" OPENSSL_VERSION_PTEXT; 76const char STACK_version[]="Stack" OPENSSL_VERSION_PTEXT;
76 77
77#include <errno.h> 78#include <errno.h>
78 79
@@ -209,7 +210,7 @@ char *sk_delete(STACK *st, int loc)
209 return(ret); 210 return(ret);
210 } 211 }
211 212
212int sk_find(STACK *st, char *data) 213static int internal_find(STACK *st, char *data, int ret_val_options)
213 { 214 {
214 char **r; 215 char **r;
215 int i; 216 int i;
@@ -232,19 +233,19 @@ int sk_find(STACK *st, char *data)
232 * not (type *) pointers, but the *pointers* to (type *) pointers, 233 * not (type *) pointers, but the *pointers* to (type *) pointers,
233 * so we get our extra level of pointer dereferencing that way. */ 234 * so we get our extra level of pointer dereferencing that way. */
234 comp_func=(int (*)(const void *,const void *))(st->comp); 235 comp_func=(int (*)(const void *,const void *))(st->comp);
235 r=(char **)bsearch(&data,(char *)st->data, 236 r=(char **)OBJ_bsearch_ex((char *)&data,(char *)st->data,
236 st->num,sizeof(char *), comp_func); 237 st->num,sizeof(char *),comp_func,ret_val_options);
237 if (r == NULL) return(-1); 238 if (r == NULL) return(-1);
238 i=(int)(r-st->data); 239 return((int)(r-st->data));
239 for ( ; i>0; i--) 240 }
240 /* This needs a cast because the type being pointed to from 241
241 * the "&" expressions are (char *) rather than (const char *). 242int sk_find(STACK *st, char *data)
242 * For an explanation, read: 243 {
243 * http://www.eskimo.com/~scs/C-faq/q11.10.html :-) */ 244 return internal_find(st, data, OBJ_BSEARCH_FIRST_VALUE_ON_MATCH);
244 if ((*st->comp)((const char * const *)&(st->data[i-1]), 245 }
245 (const char * const *)&data) < 0) 246int sk_find_ex(STACK *st, char *data)
246 break; 247 {
247 return(i); 248 return internal_find(st, data, OBJ_BSEARCH_VALUE_ON_NOMATCH);
248 } 249 }
249 250
250int sk_push(STACK *st, char *data) 251int sk_push(STACK *st, char *data)