diff options
-rw-r--r-- | src/lib/libcrypto/x509/x509_lu.c | 110 |
1 files changed, 41 insertions, 69 deletions
diff --git a/src/lib/libcrypto/x509/x509_lu.c b/src/lib/libcrypto/x509/x509_lu.c index 7bcd5f64de..a5ae33fac8 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.45 2021/11/05 17:13:14 tb Exp $ */ | 1 | /* $OpenBSD: x509_lu.c,v 1.46 2021/11/05 17:15:05 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 | * |
@@ -65,8 +65,6 @@ | |||
65 | #include <openssl/x509v3.h> | 65 | #include <openssl/x509v3.h> |
66 | #include "x509_lcl.h" | 66 | #include "x509_lcl.h" |
67 | 67 | ||
68 | static void X509_OBJECT_dec_ref_count(X509_OBJECT *a); | ||
69 | |||
70 | X509_LOOKUP * | 68 | X509_LOOKUP * |
71 | X509_LOOKUP_new(X509_LOOKUP_METHOD *method) | 69 | X509_LOOKUP_new(X509_LOOKUP_METHOD *method) |
72 | { | 70 | { |
@@ -351,103 +349,77 @@ X509_STORE_CTX_get_by_subject(X509_STORE_CTX *vs, X509_LOOKUP_TYPE type, | |||
351 | return 1; | 349 | return 1; |
352 | } | 350 | } |
353 | 351 | ||
354 | int | 352 | /* Add obj to the store. Takes ownership of obj. */ |
355 | X509_STORE_add_cert(X509_STORE *ctx, X509 *x) | 353 | static int |
354 | X509_STORE_add_object(X509_STORE *store, X509_OBJECT *obj) | ||
356 | { | 355 | { |
357 | X509_OBJECT *obj; | 356 | int ret = 0; |
358 | int ret = 1; | ||
359 | |||
360 | if (x == NULL) | ||
361 | return 0; | ||
362 | obj = malloc(sizeof(X509_OBJECT)); | ||
363 | if (obj == NULL) { | ||
364 | X509error(ERR_R_MALLOC_FAILURE); | ||
365 | return 0; | ||
366 | } | ||
367 | obj->type = X509_LU_X509; | ||
368 | obj->data.x509 = x; | ||
369 | 357 | ||
370 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); | 358 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); |
371 | 359 | ||
372 | X509_OBJECT_up_ref_count(obj); | 360 | if (X509_OBJECT_retrieve_match(store->objs, obj) != NULL) { |
361 | /* Object is already present in the store. That's fine. */ | ||
362 | ret = 1; | ||
363 | goto out; | ||
364 | } | ||
373 | 365 | ||
374 | if (X509_OBJECT_retrieve_match(ctx->objs, obj)) { | 366 | if (sk_X509_OBJECT_push(store->objs, obj) <= 0) { |
375 | X509error(X509_R_CERT_ALREADY_IN_HASH_TABLE); | 367 | X509error(ERR_R_MALLOC_FAILURE); |
376 | ret = 0; | 368 | goto out; |
377 | } else { | ||
378 | if (sk_X509_OBJECT_push(ctx->objs, obj) == 0) { | ||
379 | X509error(ERR_R_MALLOC_FAILURE); | ||
380 | ret = 0; | ||
381 | } | ||
382 | } | 369 | } |
383 | 370 | ||
384 | if (ret == 0) | 371 | obj = NULL; |
385 | X509_OBJECT_dec_ref_count(obj); | 372 | ret = 1; |
386 | 373 | ||
374 | out: | ||
387 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | 375 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); |
388 | 376 | X509_OBJECT_free(obj); | |
389 | if (ret == 0) { | ||
390 | obj->data.x509 = NULL; /* owned by the caller */ | ||
391 | X509_OBJECT_free(obj); | ||
392 | } | ||
393 | 377 | ||
394 | return ret; | 378 | return ret; |
395 | } | 379 | } |
396 | 380 | ||
397 | int | 381 | int |
398 | X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x) | 382 | X509_STORE_add_cert(X509_STORE *store, X509 *x) |
399 | { | 383 | { |
400 | X509_OBJECT *obj; | 384 | X509_OBJECT *obj; |
401 | int ret = 1; | ||
402 | 385 | ||
403 | if (x == NULL) | 386 | if (x == NULL) |
404 | return 0; | 387 | return 0; |
405 | obj = malloc(sizeof(X509_OBJECT)); | 388 | |
406 | if (obj == NULL) { | 389 | if ((obj = X509_OBJECT_new()) == NULL) |
407 | X509error(ERR_R_MALLOC_FAILURE); | 390 | return 0; |
391 | |||
392 | if (!X509_up_ref(x)) { | ||
393 | X509_OBJECT_free(obj); | ||
408 | return 0; | 394 | return 0; |
409 | } | 395 | } |
410 | obj->type = X509_LU_CRL; | ||
411 | obj->data.crl = x; | ||
412 | 396 | ||
413 | CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); | 397 | obj->type = X509_LU_X509; |
398 | obj->data.x509 = x; | ||
414 | 399 | ||
415 | X509_OBJECT_up_ref_count(obj); | 400 | return X509_STORE_add_object(store, obj); |
401 | } | ||
416 | 402 | ||
417 | if (X509_OBJECT_retrieve_match(ctx->objs, obj)) { | 403 | int |
418 | X509error(X509_R_CERT_ALREADY_IN_HASH_TABLE); | 404 | X509_STORE_add_crl(X509_STORE *store, X509_CRL *x) |
419 | ret = 0; | 405 | { |
420 | } else { | 406 | X509_OBJECT *obj; |
421 | if (sk_X509_OBJECT_push(ctx->objs, obj) == 0) { | ||
422 | X509error(ERR_R_MALLOC_FAILURE); | ||
423 | ret = 0; | ||
424 | } | ||
425 | } | ||
426 | 407 | ||
427 | if (ret == 0) | 408 | if (x == NULL) |
428 | X509_OBJECT_dec_ref_count(obj); | 409 | return 0; |
429 | 410 | ||
430 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | 411 | if ((obj = X509_OBJECT_new()) == NULL) |
412 | return 0; | ||
431 | 413 | ||
432 | if (ret == 0) { | 414 | if (!X509_CRL_up_ref(x)) { |
433 | obj->data.crl = NULL; /* owned by the caller */ | ||
434 | X509_OBJECT_free(obj); | 415 | X509_OBJECT_free(obj); |
416 | return 0; | ||
435 | } | 417 | } |
436 | 418 | ||
437 | return ret; | 419 | obj->type = X509_LU_CRL; |
438 | } | 420 | obj->data.crl = x; |
439 | 421 | ||
440 | static void | 422 | return X509_STORE_add_object(store, obj); |
441 | X509_OBJECT_dec_ref_count(X509_OBJECT *a) | ||
442 | { | ||
443 | switch (a->type) { | ||
444 | case X509_LU_X509: | ||
445 | CRYPTO_add(&a->data.x509->references, -1, CRYPTO_LOCK_X509); | ||
446 | break; | ||
447 | case X509_LU_CRL: | ||
448 | CRYPTO_add(&a->data.crl->references, -1, CRYPTO_LOCK_X509_CRL); | ||
449 | break; | ||
450 | } | ||
451 | } | 423 | } |
452 | 424 | ||
453 | int | 425 | int |