diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/stack/stack.c | 37 |
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 | } |
| 196 | LCRYPTO_ALIAS(sk_delete); | 196 | LCRYPTO_ALIAS(sk_delete); |
| 197 | 197 | ||
| 198 | static const void * | ||
| 199 | obj_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 | |||
| 198 | static int | 231 | static int |
| 199 | internal_find(_STACK *st, void *data, int ret_val_options) | 232 | internal_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); |
