From ab9017b0ff9da51afa3594fa41c84b7c88e1115d Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Mon, 20 Apr 2015 15:25:21 -0700 Subject: [PATCH] Revert "bio: remove reference count." Android uses BIO reference counting. This reverts commit 9bde6aeb76b1d2a45d76637553c3fb3f31e4ecbd. Change-Id: Ibf4a7f42477549d10829a424ea3b52f09098666c Reviewed-on: https://boringssl-review.googlesource.com/4472 Reviewed-by: David Benjamin Reviewed-by: Adam Langley --- crypto/bio/bio.c | 6 ++++++ include/openssl/bio.h | 1 + 2 files changed, 7 insertions(+) diff --git a/crypto/bio/bio.c b/crypto/bio/bio.c index ad6c259b..2fcad6cc 100644 --- a/crypto/bio/bio.c +++ b/crypto/bio/bio.c @@ -75,6 +75,7 @@ static int bio_set(BIO *bio, const BIO_METHOD *method) { bio->method = method; bio->shutdown = 1; + bio->references = 1; if (method->create != NULL && !method->create(bio)) { return 0; @@ -102,6 +103,11 @@ int BIO_free(BIO *bio) { BIO *next_bio; for (; bio != NULL; bio = next_bio) { + int refs = CRYPTO_add(&bio->references, -1, CRYPTO_LOCK_BIO); + if (refs > 0) { + return 0; + } + if (bio->callback != NULL) { int i = (int)bio->callback(bio, BIO_CB_FREE, NULL, 0, 0, 1); if (i <= 0) { diff --git a/include/openssl/bio.h b/include/openssl/bio.h index f0e2519e..84996e97 100644 --- a/include/openssl/bio.h +++ b/include/openssl/bio.h @@ -781,6 +781,7 @@ struct bio_st { /* num is a BIO-specific value. For example, in fd BIOs it's used to store a * file descriptor. */ int num; + int references; void *ptr; /* next_bio points to the next |BIO| in a chain. This |BIO| owns a reference * to |next_bio|. */