summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormiod <>2016-11-08 21:22:55 +0000
committermiod <>2016-11-08 21:22:55 +0000
commit741233cfaaedfc9709cf01e0bf3d9304cda9ed58 (patch)
treed872c53168e35402102a7d7fdc8583e1bb83531b
parentacfc5dfa14919694cee5af74f2d461fc9cc191a3 (diff)
downloadopenbsd-741233cfaaedfc9709cf01e0bf3d9304cda9ed58.tar.gz
openbsd-741233cfaaedfc9709cf01e0bf3d9304cda9ed58.tar.bz2
openbsd-741233cfaaedfc9709cf01e0bf3d9304cda9ed58.zip
Check for stack push failure, and correctly destroy the object we failed
to push in that case. While there replace an inline version of X509_OBJECT_free_contents() by a call to said function. ok beck@
-rw-r--r--src/lib/libcrypto/x509/x509_lu.c67
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
67static void X509_OBJECT_dec_ref_count(X509_OBJECT *a);
68/* static void X509_OBJECT_up_ref_count(X509_OBJECT *a); */
69
67X509_LOOKUP * 70X509_LOOKUP *
68X509_LOOKUP_new(X509_LOOKUP_METHOD *method) 71X509_LOOKUP_new(X509_LOOKUP_METHOD *method)
69{ 72{
@@ -231,16 +234,9 @@ err:
231} 234}
232 235
233static void 236static void
234cleanup(X509_OBJECT *a) 237X509_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
414void 428static void
429X509_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
415X509_OBJECT_up_ref_count(X509_OBJECT *a) 442X509_OBJECT_up_ref_count(X509_OBJECT *a)
416{ 443{
417 switch (a->type) { 444 switch (a->type) {