]> granicus.if.org Git - apache/commitdiff
Assure that we block on the read BIO when we invoke the read BIO for both
authorWilliam A. Rowe Jr <wrowe@apache.org>
Fri, 16 May 2003 16:11:03 +0000 (16:11 +0000)
committerWilliam A. Rowe Jr <wrowe@apache.org>
Fri, 16 May 2003 16:11:03 +0000 (16:11 +0000)
  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@99863 13f79535-47bb-0310-9956-ffa450edef68

modules/ssl/ssl_engine_io.c

index 2bf7221d5b88ee567a31ccc3d5bf8ebf1cadd5dc..6ebbe9a602755246caf22759c46a900a502b0118 100644 (file)
@@ -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)