Commit 9cb8ff49 authored by William A. Rowe Jr's avatar William A. Rowe Jr
Browse files

  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 <David.Deaves@dd.id.au>, William Rowe


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk/modules/ssl@99863 13f79535-47bb-0310-9956-ffa450edef68
parent 52b6562c
Loading
Loading
Loading
Loading
+14 −4
Original line number Diff line number Diff line
@@ -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)