diff options
author | Giovanni Bechis <gbechis@apache.org> | 2022-02-01 15:29:18 +0000 |
---|---|---|
committer | Giovanni Bechis <gbechis@apache.org> | 2022-02-01 15:29:18 +0000 |
commit | 3462fcfa750b2b3058c6684cb895f10b0f3b6c7e (patch) | |
tree | 044fa6032350de1a1d0374b69a9595a2c5a66eb5 | |
parent | 8a521a5832f97f82204a3233c1f7645293862f19 (diff) | |
download | httpd-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.c | 4 | ||||
-rw-r--r-- | modules/ssl/ssl_engine_io.c | 19 | ||||
-rw-r--r-- | modules/ssl/ssl_engine_vars.c | 5 | ||||
-rw-r--r-- | modules/ssl/ssl_private.h | 2 | ||||
-rw-r--r-- | modules/ssl/ssl_util_ocsp.c | 3 |
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 */ |