summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Bechis <gbechis@apache.org>2022-02-01 15:29:18 +0000
committerGiovanni Bechis <gbechis@apache.org>2022-02-01 15:29:18 +0000
commit3462fcfa750b2b3058c6684cb895f10b0f3b6c7e (patch)
tree044fa6032350de1a1d0374b69a9595a2c5a66eb5
parent8a521a5832f97f82204a3233c1f7645293862f19 (diff)
downloadhttpd-3462fcfa750b2b3058c6684cb895f10b0f3b6c7e.tar.gz
check BIO_new(3) return values
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1897663 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--modules/ssl/mod_ssl.c4
-rw-r--r--modules/ssl/ssl_engine_io.c19
-rw-r--r--modules/ssl/ssl_engine_vars.c5
-rw-r--r--modules/ssl/ssl_private.h2
-rw-r--r--modules/ssl/ssl_util_ocsp.c3
5 files changed, 25 insertions, 8 deletions
diff --git a/modules/ssl/mod_ssl.c b/modules/ssl/mod_ssl.c
index 2489aa5ca8..b06c7beabe 100644
--- a/modules/ssl/mod_ssl.c
+++ b/modules/ssl/mod_ssl.c
@@ -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)
diff --git a/modules/ssl/ssl_engine_io.c b/modules/ssl/ssl_engine_io.c
index 4bb380adec..4445b1f787 100644
--- a/modules/ssl/ssl_engine_io.c
+++ b/modules/ssl/ssl_engine_io.c
@@ -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)
diff --git a/modules/ssl/ssl_engine_vars.c b/modules/ssl/ssl_engine_vars.c
index 6598ec323b..df7a42b663 100644
--- a/modules/ssl/ssl_engine_vars.c
+++ b/modules/ssl/ssl_engine_vars.c
@@ -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.
diff --git a/modules/ssl/ssl_private.h b/modules/ssl/ssl_private.h
index 7d623b216f..74070d9a68 100644
--- a/modules/ssl/ssl_private.h
+++ b/modules/ssl/ssl_private.h
@@ -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);
diff --git a/modules/ssl/ssl_util_ocsp.c b/modules/ssl/ssl_util_ocsp.c
index b9c8a0b850..b8d27f9be7 100644
--- a/modules/ssl/ssl_util_ocsp.c
+++ b/modules/ssl/ssl_util_ocsp.c
@@ -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 */