From f066f6c662c1c0a5c0022332c00e5c3d823fdcbd Mon Sep 17 00:00:00 2001 From: "William A. Rowe Jr" Date: Fri, 16 May 2003 16:11:03 +0000 Subject: [PATCH] Assure that we block on the read BIO when we invoke the read BIO for both first-use cases (via ssl_io_input_add_filter) and when we are writing and need response from the client (via ssl_io_filter_output). Both of these cases are always blocking. [ PR: 19242 Submitted by: David Deaves , William Rowe git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@99863 13f79535-47bb-0310-9956-ffa450edef68 --- modules/ssl/ssl_engine_io.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/modules/ssl/ssl_engine_io.c b/modules/ssl/ssl_engine_io.c index 2bf7221d5b..6ebbe9a602 100644 --- a/modules/ssl/ssl_engine_io.c +++ b/modules/ssl/ssl_engine_io.c @@ -1358,6 +1358,8 @@ static apr_status_t ssl_io_filter_output(ap_filter_t *f, { apr_status_t status = APR_SUCCESS; ssl_filter_ctx_t *filter_ctx = f->ctx; + bio_filter_in_ctx_t *inctx = (bio_filter_in_ctx_t *) + (filter_ctx->pbioRead->ptr); if (f->c->aborted) { apr_brigade_cleanup(bb); @@ -1369,6 +1371,13 @@ static apr_status_t ssl_io_filter_output(ap_filter_t *f, return ap_pass_brigade(f->next, bb); } + /* When we are the writer, we must initialize the inctx + * mode so that we block for any required ssl input, because + * output filtering is always nonblocking. + */ + inctx->mode = APR_MODE_READBYTES; + inctx->block = AP_BLOCK_READ; + if ((status = ssl_io_filter_connect(filter_ctx)) != APR_SUCCESS) { return ssl_io_filter_error(f, bb, status); } @@ -1442,15 +1451,16 @@ static void ssl_io_input_add_filter(ssl_filter_ctx_t *filter_ctx, conn_rec *c, filter_ctx->pbioRead = BIO_new(&bio_filter_in_method); filter_ctx->pbioRead->ptr = (void *)inctx; - inctx->filter_ctx = filter_ctx; inctx->ssl = ssl; inctx->bio_out = filter_ctx->pbioWrite; inctx->f = filter_ctx->pInputFilter; - inctx->bb = apr_brigade_create(c->pool, c->bucket_alloc); - + inctx->rc = APR_SUCCESS; + inctx->mode = AP_MODE_READBYTES; inctx->cbuf.length = 0; - + inctx->bb = apr_brigade_create(c->pool, c->bucket_alloc); + inctx->block = APR_BLOCK_READ; inctx->pool = c->pool; + inctx->filter_ctx = filter_ctx; } void ssl_io_filter_init(conn_rec *c, SSL *ssl) -- 2.40.0