summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libcrypto/x509/x509_lu.c55
1 files changed, 26 insertions, 29 deletions
diff --git a/src/lib/libcrypto/x509/x509_lu.c b/src/lib/libcrypto/x509/x509_lu.c
index 0d4f4ad2ff..7bcd5f64de 100644
--- a/src/lib/libcrypto/x509/x509_lu.c
+++ b/src/lib/libcrypto/x509/x509_lu.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: x509_lu.c,v 1.44 2021/11/05 17:11:28 tb Exp $ */ 1/* $OpenBSD: x509_lu.c,v 1.45 2021/11/05 17:13:14 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 *
@@ -237,67 +237,64 @@ X509_OBJECT_free(X509_OBJECT *a)
237} 237}
238 238
239void 239void
240X509_STORE_free(X509_STORE *vfy) 240X509_STORE_free(X509_STORE *store)
241{ 241{
242 int i;
243 STACK_OF(X509_LOOKUP) *sk; 242 STACK_OF(X509_LOOKUP) *sk;
244 X509_LOOKUP *lu; 243 X509_LOOKUP *lu;
244 int i;
245 245
246 if (vfy == NULL) 246 if (store == NULL)
247 return; 247 return;
248 248
249 i = CRYPTO_add(&vfy->references, -1, CRYPTO_LOCK_X509_STORE); 249 if (CRYPTO_add(&store->references, -1, CRYPTO_LOCK_X509_STORE) > 0)
250 if (i > 0)
251 return; 250 return;
252 251
253 sk = vfy->get_cert_methods; 252 sk = store->get_cert_methods;
254 for (i = 0; i < sk_X509_LOOKUP_num(sk); i++) { 253 for (i = 0; i < sk_X509_LOOKUP_num(sk); i++) {
255 lu = sk_X509_LOOKUP_value(sk, i); 254 lu = sk_X509_LOOKUP_value(sk, i);
256 X509_LOOKUP_shutdown(lu); 255 X509_LOOKUP_shutdown(lu);
257 X509_LOOKUP_free(lu); 256 X509_LOOKUP_free(lu);
258 } 257 }
259 sk_X509_LOOKUP_free(sk); 258 sk_X509_LOOKUP_free(sk);
260 sk_X509_OBJECT_pop_free(vfy->objs, X509_OBJECT_free); 259 sk_X509_OBJECT_pop_free(store->objs, X509_OBJECT_free);
261 260
262 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_X509_STORE, vfy, &vfy->ex_data); 261 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_X509_STORE, store, &store->ex_data);
263 X509_VERIFY_PARAM_free(vfy->param); 262 X509_VERIFY_PARAM_free(store->param);
264 free(vfy); 263 free(store);
265} 264}
266 265
267int 266int
268X509_STORE_up_ref(X509_STORE *x) 267X509_STORE_up_ref(X509_STORE *store)
269{ 268{
270 int refs = CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509_STORE); 269 return CRYPTO_add(&store->references, 1, CRYPTO_LOCK_X509_STORE) > 1;
271 return (refs > 1) ? 1 : 0;
272} 270}
273 271
274X509_LOOKUP * 272X509_LOOKUP *
275X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m) 273X509_STORE_add_lookup(X509_STORE *store, X509_LOOKUP_METHOD *method)
276{ 274{
277 int i;
278 STACK_OF(X509_LOOKUP) *sk; 275 STACK_OF(X509_LOOKUP) *sk;
279 X509_LOOKUP *lu; 276 X509_LOOKUP *lu;
277 int i;
280 278
281 sk = v->get_cert_methods; 279 sk = store->get_cert_methods;
282 for (i = 0; i < sk_X509_LOOKUP_num(sk); i++) { 280 for (i = 0; i < sk_X509_LOOKUP_num(sk); i++) {
283 lu = sk_X509_LOOKUP_value(sk, i); 281 lu = sk_X509_LOOKUP_value(sk, i);
284 if (m == lu->method) { 282 if (method == lu->method) {
285 return lu; 283 return lu;
286 } 284 }
287 } 285 }
288 /* a new one */ 286
289 lu = X509_LOOKUP_new(m); 287 if ((lu = X509_LOOKUP_new(method)) == NULL)
290 if (lu == NULL) 288 return NULL;
289
290 lu->store_ctx = store;
291 if (sk_X509_LOOKUP_push(store->get_cert_methods, lu) <= 0) {
292 X509error(ERR_R_MALLOC_FAILURE);
293 X509_LOOKUP_free(lu);
291 return NULL; 294 return NULL;
292 else {
293 lu->store_ctx = v;
294 if (sk_X509_LOOKUP_push(v->get_cert_methods, lu))
295 return lu;
296 else {
297 X509_LOOKUP_free(lu);
298 return NULL;
299 }
300 } 295 }
296
297 return lu;
301} 298}
302 299
303X509_OBJECT * 300X509_OBJECT *