summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/stack
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/stack')
-rw-r--r--src/lib/libcrypto/stack/stack.c37
1 files changed, 35 insertions, 2 deletions
diff --git a/src/lib/libcrypto/stack/stack.c b/src/lib/libcrypto/stack/stack.c
index f5c568dc5e..818e738447 100644
--- a/src/lib/libcrypto/stack/stack.c
+++ b/src/lib/libcrypto/stack/stack.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: stack.c,v 1.24 2024/01/13 16:32:53 tb Exp $ */ 1/* $OpenBSD: stack.c,v 1.25 2024/02/26 15:00:30 tb Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -195,6 +195,39 @@ sk_delete(_STACK *st, int loc)
195} 195}
196LCRYPTO_ALIAS(sk_delete); 196LCRYPTO_ALIAS(sk_delete);
197 197
198static const void *
199obj_bsearch_ex(const void *key, const void *base_, int num, int size,
200 int (*cmp)(const void *, const void *), int flags)
201{
202 const char *base = base_;
203 int l, h, i = 0, c = 0;
204 const char *p = NULL;
205
206 if (num == 0)
207 return (NULL);
208 l = 0;
209 h = num;
210 while (l < h) {
211 i = (l + h) / 2;
212 p = &(base[i * size]);
213 c = (*cmp)(key, p);
214 if (c < 0)
215 h = i;
216 else if (c > 0)
217 l = i + 1;
218 else
219 break;
220 }
221 if (c != 0 && !(flags & OBJ_BSEARCH_VALUE_ON_NOMATCH))
222 p = NULL;
223 else if (c == 0 && (flags & OBJ_BSEARCH_FIRST_VALUE_ON_MATCH)) {
224 while (i > 0 && (*cmp)(key, &(base[(i - 1) * size])) == 0)
225 i--;
226 p = &(base[i * size]);
227 }
228 return (p);
229}
230
198static int 231static int
199internal_find(_STACK *st, void *data, int ret_val_options) 232internal_find(_STACK *st, void *data, int ret_val_options)
200{ 233{
@@ -213,7 +246,7 @@ internal_find(_STACK *st, void *data, int ret_val_options)
213 sk_sort(st); 246 sk_sort(st);
214 if (data == NULL) 247 if (data == NULL)
215 return (-1); 248 return (-1);
216 r = OBJ_bsearch_ex_(&data, st->data, st->num, sizeof(void *), st->comp, 249 r = obj_bsearch_ex(&data, st->data, st->num, sizeof(void *), st->comp,
217 ret_val_options); 250 ret_val_options);
218 if (r == NULL) 251 if (r == NULL)
219 return (-1); 252 return (-1);