BIO_new_from_core_bio: Check for NULL pointer after calling get_globals master
authorJiasheng Jiang <jiasheng@iscas.ac.cn>
Tue, 25 Jan 2022 03:05:13 +0000 (11:05 +0800)
committerTomas Mraz <tomas@openssl.org>
Thu, 27 Jan 2022 16:46:19 +0000 (17:46 +0100)
The get_globals could return NULL, for example,
CRYPTO_THREAD_read_lock() failed.
Therefore, just checking the member of 'bcgbl' is not enough.
We need to check 'bcgbl' itself too in order to avoid the dereference of
the NULL pointer.
And the caller of ossl_bio_init_core(), OSSL_LIB_CTX_new_from_dispatch()
in `crypto/context.c`, has already checked return value and dealed with
the situation if it returns 0.

Signed-off-by: Jiasheng Jiang <jiasheng@iscas.ac.cn>
Reviewed-by: Paul Dale <pauli@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/17581)

crypto/bio/bss_core.c

index de774e2b005f463f5409d3107cf72b1129e1c570..b78b1bedaabc8415268480134a144f2fe0e4bfb4 100644 (file)
@@ -48,7 +48,7 @@ static int bio_core_read_ex(BIO *bio, char *data, size_t data_len,
 {
     BIO_CORE_GLOBALS *bcgbl = get_globals(bio->libctx);
 
-    if (bcgbl->c_bio_read_ex == NULL)
+    if (bcgbl == NULL || bcgbl->c_bio_read_ex == NULL)
         return 0;
     return bcgbl->c_bio_read_ex(BIO_get_data(bio), data, data_len, bytes_read);
 }
@@ -58,7 +58,7 @@ static int bio_core_write_ex(BIO *bio, const char *data, size_t data_len,
 {
     BIO_CORE_GLOBALS *bcgbl = get_globals(bio->libctx);
 
-    if (bcgbl->c_bio_write_ex == NULL)
+    if (bcgbl == NULL || bcgbl->c_bio_write_ex == NULL)
         return 0;
     return bcgbl->c_bio_write_ex(BIO_get_data(bio), data, data_len, written);
 }
@@ -67,7 +67,7 @@ static long bio_core_ctrl(BIO *bio, int cmd, long num, void *ptr)
 {
     BIO_CORE_GLOBALS *bcgbl = get_globals(bio->libctx);
 
-    if (bcgbl->c_bio_ctrl == NULL)
+    if (bcgbl == NULL || bcgbl->c_bio_ctrl == NULL)
         return -1;
     return bcgbl->c_bio_ctrl(BIO_get_data(bio), cmd, num, ptr);
 }
@@ -76,7 +76,7 @@ static int bio_core_gets(BIO *bio, char *buf, int size)
 {
     BIO_CORE_GLOBALS *bcgbl = get_globals(bio->libctx);
 
-    if (bcgbl->c_bio_gets == NULL)
+    if (bcgbl == NULL || bcgbl->c_bio_gets == NULL)
         return -1;
     return bcgbl->c_bio_gets(BIO_get_data(bio), buf, size);
 }
@@ -85,7 +85,7 @@ static int bio_core_puts(BIO *bio, const char *str)
 {
     BIO_CORE_GLOBALS *bcgbl = get_globals(bio->libctx);
 
-    if (bcgbl->c_bio_puts == NULL)
+    if (bcgbl == NULL || bcgbl->c_bio_puts == NULL)
         return -1;
     return bcgbl->c_bio_puts(BIO_get_data(bio), str);
 }
@@ -101,6 +101,9 @@ static int bio_core_free(BIO *bio)
 {
     BIO_CORE_GLOBALS *bcgbl = get_globals(bio->libctx);
 
+    if (bcgbl == NULL)
+        return 0;
+
     BIO_set_init(bio, 0);
     bcgbl->c_bio_free(BIO_get_data(bio));
 
@@ -133,7 +136,7 @@ BIO *BIO_new_from_core_bio(OSSL_LIB_CTX *libctx, OSSL_CORE_BIO *corebio)
     BIO_CORE_GLOBALS *bcgbl = get_globals(libctx);
 
     /* Check the library context has been initialised with the callbacks */
-    if (bcgbl->c_bio_write_ex == NULL && bcgbl->c_bio_read_ex == NULL)
+    if (bcgbl == NULL || (bcgbl->c_bio_write_ex == NULL && bcgbl->c_bio_read_ex == NULL))
         return NULL;
 
     if ((outbio = BIO_new_ex(libctx, BIO_s_core())) == NULL)
@@ -151,6 +154,9 @@ int ossl_bio_init_core(OSSL_LIB_CTX *libctx, const OSSL_DISPATCH *fns)
 {
     BIO_CORE_GLOBALS *bcgbl = get_globals(libctx);
 
+    if (bcgbl == NULL)
+           return 0;
+
     for (; fns->function_id != 0; fns++) {
         switch (fns->function_id) {
         case OSSL_FUNC_BIO_READ_EX: