BIO_free should call method->destroy before free'ing member fields
authorFdaSilvaYY <fdasilvayy@gmail.com>
Thu, 28 Apr 2016 18:13:44 +0000 (20:13 +0200)
committerFdaSilvaYY <fdasilvayy@gmail.com>
Thu, 28 Apr 2016 20:16:52 +0000 (22:16 +0200)
Reviewed-by: Tim Hudson <tjh@openssl.org>
Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/1007)

crypto/bio/bio_lib.c

index 6ddc19fc9ae0f2a44ba7486245b74bbbc452a888..8f6848511eecd47de73968a582cb7faf590547d4 100644 (file)
@@ -98,6 +98,7 @@ int BIO_set(BIO *bio, const BIO_METHOD *method)
 
     bio->lock = CRYPTO_THREAD_lock_new();
     if (bio->lock == NULL) {
+        BIOerr(BIO_F_BIO_SET, ERR_R_MALLOC_FAILURE);
         CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data);
         return 0;
     }
@@ -131,13 +132,13 @@ int BIO_free(BIO *a)
         ((i = (int)a->callback(a, BIO_CB_FREE, NULL, 0, 0L, 1L)) <= 0))
         return i;
 
+    if ((a->method != NULL) && (a->method->destroy != NULL))
+        a->method->destroy(a);
+
     CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, a, &a->ex_data);
 
     CRYPTO_THREAD_lock_free(a->lock);
 
-    if ((a->method != NULL) && (a->method->destroy != NULL))
-        a->method->destroy(a);
-
     OPENSSL_free(a);
 
     return 1;