diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/x509/x509_lu.c | 67 |
1 files changed, 47 insertions, 20 deletions
diff --git a/src/lib/libcrypto/x509/x509_lu.c b/src/lib/libcrypto/x509/x509_lu.c index fdb10023be..fc1256788e 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.20 2015/04/25 16:02:55 doug Exp $ */ | 1 | /* $OpenBSD: x509_lu.c,v 1.21 2016/11/08 21:22:55 miod 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 | * |
| @@ -64,6 +64,9 @@ | |||
| 64 | #include <openssl/x509v3.h> | 64 | #include <openssl/x509v3.h> |
| 65 | #include "x509_lcl.h" | 65 | #include "x509_lcl.h" |
| 66 | 66 | ||
| 67 | static void X509_OBJECT_dec_ref_count(X509_OBJECT *a); | ||
| 68 | /* static void X509_OBJECT_up_ref_count(X509_OBJECT *a); */ | ||
| 69 | |||
| 67 | X509_LOOKUP * | 70 | X509_LOOKUP * |
| 68 | X509_LOOKUP_new(X509_LOOKUP_METHOD *method) | 71 | X509_LOOKUP_new(X509_LOOKUP_METHOD *method) |
| 69 | { | 72 | { |
| @@ -231,16 +234,9 @@ err: | |||
| 231 | } | 234 | } |
| 232 | 235 | ||
| 233 | static void | 236 | static void |
| 234 | cleanup(X509_OBJECT *a) | 237 | X509_OBJECT_free(X509_OBJECT *a) |
| 235 | { | 238 | { |
| 236 | if (a->type == X509_LU_X509) { | 239 | X509_OBJECT_free_contents(a); |
| 237 | X509_free(a->data.x509); | ||
| 238 | } else if (a->type == X509_LU_CRL) { | ||
| 239 | X509_CRL_free(a->data.crl); | ||
| 240 | } else { | ||
| 241 | /* abort(); */ | ||
| 242 | } | ||
| 243 | |||
| 244 | free(a); | 240 | free(a); |
| 245 | } | 241 | } |
| 246 | 242 | ||
| @@ -265,7 +261,7 @@ X509_STORE_free(X509_STORE *vfy) | |||
| 265 | X509_LOOKUP_free(lu); | 261 | X509_LOOKUP_free(lu); |
| 266 | } | 262 | } |
| 267 | sk_X509_LOOKUP_free(sk); | 263 | sk_X509_LOOKUP_free(sk); |
| 268 | sk_X509_OBJECT_pop_free(vfy->objs, cleanup); | 264 | sk_X509_OBJECT_pop_free(vfy->objs, X509_OBJECT_free); |
| 269 | 265 | ||
| 270 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_X509_STORE, vfy, &vfy->ex_data); | 266 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_X509_STORE, vfy, &vfy->ex_data); |
| 271 | X509_VERIFY_PARAM_free(vfy->param); | 267 | X509_VERIFY_PARAM_free(vfy->param); |
| @@ -364,16 +360,25 @@ X509_STORE_add_cert(X509_STORE *ctx, X509 *x) | |||
| 364 | X509_OBJECT_up_ref_count(obj); | 360 | X509_OBJECT_up_ref_count(obj); |
| 365 | 361 | ||
| 366 | if (X509_OBJECT_retrieve_match(ctx->objs, obj)) { | 362 | if (X509_OBJECT_retrieve_match(ctx->objs, obj)) { |
| 367 | X509_OBJECT_free_contents(obj); | ||
| 368 | free(obj); | ||
| 369 | X509err(X509_F_X509_STORE_ADD_CERT, | 363 | X509err(X509_F_X509_STORE_ADD_CERT, |
| 370 | X509_R_CERT_ALREADY_IN_HASH_TABLE); | 364 | X509_R_CERT_ALREADY_IN_HASH_TABLE); |
| 371 | ret = 0; | 365 | ret = 0; |
| 372 | } else | 366 | } else { |
| 373 | sk_X509_OBJECT_push(ctx->objs, obj); | 367 | if (sk_X509_OBJECT_push(ctx->objs, obj) == 0) { |
| 368 | X509err(X509_F_X509_STORE_ADD_CERT, | ||
| 369 | ERR_R_MALLOC_FAILURE); | ||
| 370 | ret = 0; | ||
| 371 | } | ||
| 372 | } | ||
| 373 | |||
| 374 | if (ret == 0) | ||
| 375 | X509_OBJECT_dec_ref_count(obj); | ||
| 374 | 376 | ||
| 375 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | 377 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); |
| 376 | 378 | ||
| 379 | if (ret == 0) | ||
| 380 | X509_OBJECT_free(obj); | ||
| 381 | |||
| 377 | return ret; | 382 | return ret; |
| 378 | } | 383 | } |
| 379 | 384 | ||
| @@ -398,20 +403,42 @@ X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x) | |||
| 398 | X509_OBJECT_up_ref_count(obj); | 403 | X509_OBJECT_up_ref_count(obj); |
| 399 | 404 | ||
| 400 | if (X509_OBJECT_retrieve_match(ctx->objs, obj)) { | 405 | if (X509_OBJECT_retrieve_match(ctx->objs, obj)) { |
| 401 | X509_OBJECT_free_contents(obj); | ||
| 402 | free(obj); | ||
| 403 | X509err(X509_F_X509_STORE_ADD_CRL, | 406 | X509err(X509_F_X509_STORE_ADD_CRL, |
| 404 | X509_R_CERT_ALREADY_IN_HASH_TABLE); | 407 | X509_R_CERT_ALREADY_IN_HASH_TABLE); |
| 405 | ret = 0; | 408 | ret = 0; |
| 406 | } else | 409 | } else { |
| 407 | sk_X509_OBJECT_push(ctx->objs, obj); | 410 | if (sk_X509_OBJECT_push(ctx->objs, obj) == 0) { |
| 411 | X509err(X509_F_X509_STORE_ADD_CRL, | ||
| 412 | ERR_R_MALLOC_FAILURE); | ||
| 413 | ret = 0; | ||
| 414 | } | ||
| 415 | } | ||
| 416 | |||
| 417 | if (ret == 0) | ||
| 418 | X509_OBJECT_dec_ref_count(obj); | ||
| 408 | 419 | ||
| 409 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); | 420 | CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); |
| 410 | 421 | ||
| 422 | if (ret == 0) | ||
| 423 | X509_OBJECT_free(obj); | ||
| 424 | |||
| 411 | return ret; | 425 | return ret; |
| 412 | } | 426 | } |
| 413 | 427 | ||
| 414 | void | 428 | static void |
| 429 | X509_OBJECT_dec_ref_count(X509_OBJECT *a) | ||
| 430 | { | ||
| 431 | switch (a->type) { | ||
| 432 | case X509_LU_X509: | ||
| 433 | CRYPTO_add(&a->data.x509->references, -1, CRYPTO_LOCK_X509); | ||
| 434 | break; | ||
| 435 | case X509_LU_CRL: | ||
| 436 | CRYPTO_add(&a->data.crl->references, -1, CRYPTO_LOCK_X509_CRL); | ||
| 437 | break; | ||
| 438 | } | ||
| 439 | } | ||
| 440 | |||
| 441 | /*static*/ void | ||
| 415 | X509_OBJECT_up_ref_count(X509_OBJECT *a) | 442 | X509_OBJECT_up_ref_count(X509_OBJECT *a) |
| 416 | { | 443 | { |
| 417 | switch (a->type) { | 444 | switch (a->type) { |
