]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
check BIO_new(3) return values
authorGiovanni Bechis <gbechis@apache.org>
Tue, 1 Feb 2022 15:29:18 +0000 (15:29 +0000)
committerGiovanni Bechis <gbechis@apache.org>
Tue, 1 Feb 2022 15:29:18 +0000 (15:29 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1897663 13f79535-47bb-0310-9956-ffa450edef68

modules/ssl/mod_ssl.c
modules/ssl/ssl_engine_io.c
modules/ssl/ssl_engine_vars.c
modules/ssl/ssl_private.h
modules/ssl/ssl_util_ocsp.c

index 2489aa5ca810a5bcddb2bf0733d73538f4f8863d..b06c7beabef075130c85b868ab41e285d82990f2 100644 (file)
@@ -642,9 +642,7 @@ int ssl_init_ssl_connection(conn_rec *c, request_rec *r)
 
     SSL_set_verify_result(ssl, X509_V_OK);
 
-    ssl_io_filter_init(c, r, ssl);
-
-    return APR_SUCCESS;
+    return ssl_io_filter_init(c, r, ssl);
 }
 
 static const char *ssl_hook_http_scheme(const request_rec *r)
index 4bb380adec812f41fb28370217ed02ee10bdf510..4445b1f78787722d925aadf7798ac5d53f9966b8 100644 (file)
@@ -2320,7 +2320,7 @@ static apr_status_t ssl_io_filter_buffer(ap_filter_t *f,
 /* The request_rec pointer is passed in here only to ensure that the
  * filter chain is modified correctly when doing a TLS upgrade.  It
  * must *not* be used otherwise. */
-static void ssl_io_input_add_filter(ssl_filter_ctx_t *filter_ctx, conn_rec *c,
+static apr_status_t ssl_io_input_add_filter(ssl_filter_ctx_t *filter_ctx, conn_rec *c,
                                     request_rec *r, SSL *ssl)
 {
     bio_filter_in_ctx_t *inctx;
@@ -2334,6 +2334,9 @@ static void ssl_io_input_add_filter(ssl_filter_ctx_t *filter_ctx, conn_rec *c,
 #else
     filter_ctx->pbioRead = BIO_new(bio_filter_in_method);
 #endif
+    if(filter_ctx->pbioRead == NULL) {
+      return APR_ENOMEM;
+    }
     BIO_set_data(filter_ctx->pbioRead, (void *)inctx);
 
     inctx->c = c;
@@ -2347,14 +2350,16 @@ static void ssl_io_input_add_filter(ssl_filter_ctx_t *filter_ctx, conn_rec *c,
     inctx->block = APR_BLOCK_READ;
     inctx->pool = c->pool;
     inctx->filter_ctx = filter_ctx;
+    return APR_SUCCESS;
 }
 
 /* The request_rec pointer is passed in here only to ensure that the
  * filter chain is modified correctly when doing a TLS upgrade.  It
  * must *not* be used otherwise. */
-void ssl_io_filter_init(conn_rec *c, request_rec *r, SSL *ssl)
+apr_status_t ssl_io_filter_init(conn_rec *c, request_rec *r, SSL *ssl)
 {
     ssl_filter_ctx_t *filter_ctx;
+    apr_status_t rv = APR_SUCCESS;
 
     filter_ctx = apr_palloc(c->pool, sizeof(ssl_filter_ctx_t));
 
@@ -2370,9 +2375,15 @@ void ssl_io_filter_init(conn_rec *c, request_rec *r, SSL *ssl)
 #else
     filter_ctx->pbioWrite       = BIO_new(bio_filter_out_method);
 #endif
+    if(filter_ctx->pbioWrite == NULL) {
+      return APR_ENOMEM;
+    }
     BIO_set_data(filter_ctx->pbioWrite, (void *)bio_filter_out_ctx_new(filter_ctx, c));
 
-    ssl_io_input_add_filter(filter_ctx, c, r, ssl);
+    rv = ssl_io_input_add_filter(filter_ctx, c, r, ssl);
+    if(rv != APR_SUCCESS) {
+      return rv;
+    }
 
     SSL_set_bio(ssl, filter_ctx->pbioRead, filter_ctx->pbioWrite);
     filter_ctx->pssl            = ssl;
@@ -2391,7 +2402,7 @@ void ssl_io_filter_init(conn_rec *c, request_rec *r, SSL *ssl)
         }
     }
 
-    return;
+    return APR_SUCCESS;
 }
 
 void ssl_io_filter_register(apr_pool_t *p)
index 6598ec323b1dfce3bf92dc1b257867a4ac1d1a3a..df7a42b6630919e1bb6790910a7121b59ff2e71f 100644 (file)
@@ -1157,6 +1157,11 @@ apr_array_header_t *ssl_ext_list(apr_pool_t *p, conn_rec *c, int peer,
 
         if (OBJ_cmp(X509_EXTENSION_get_object(ext), oid) == 0) {
             BIO *bio = BIO_new(BIO_s_mem());
+            if(bio == NULL) {
+              X509_free(xs);
+              ASN1_OBJECT_free(oid);
+              return NULL;
+            }
 
             /* We want to obtain a string representation of the extensions
              * value and add it to the array we're building.
index 7d623b216f3d590e76845ab23049b184e732e758..74070d9a686d24097292ef4ae20750861ad5db4e 100644 (file)
@@ -1010,7 +1010,7 @@ void         modssl_callback_keylog(const SSL *ssl, const char *line);
 #endif
 
 /**  I/O  */
-void         ssl_io_filter_init(conn_rec *, request_rec *r, SSL *);
+apr_status_t ssl_io_filter_init(conn_rec *, request_rec *r, SSL *);
 void         ssl_io_filter_register(apr_pool_t *);
 long         ssl_io_data_cb(BIO *, int, const char *, int, long, long);
 
index b9c8a0b850e1cec468e3b9652b1c9faf23aa0cf1..b8d27f9be73036ee2379787c5497bfa4287fd6d6 100644 (file)
@@ -36,6 +36,9 @@ static BIO *serialize_request(OCSP_REQUEST *req, const apr_uri_t *uri,
     len = i2d_OCSP_REQUEST(req, NULL);
 
     bio = BIO_new(BIO_s_mem());
+    if(bio == NULL) {
+      return NULL;
+    }
 
     BIO_printf(bio, "POST ");
     /* Use full URL instead of URI in case of a request through a proxy */