]> granicus.if.org Git - apache/commitdiff
Rule one of winsock and other one-offs (even unix EINTR) ... blocking
authorWilliam A. Rowe Jr <wrowe@apache.org>
Wed, 6 Nov 2002 07:29:36 +0000 (07:29 +0000)
committerWilliam A. Rowe Jr <wrowe@apache.org>
Wed, 6 Nov 2002 07:29:36 +0000 (07:29 +0000)
  isn't necessarily blocking.  Should not have changed this in the prior
  commit, and adding the same retry to the -1/EAGAIN|EINTR case.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@97423 13f79535-47bb-0310-9956-ffa450edef68

modules/ssl/ssl_engine_io.c

index c2f0ce824d87eb13cbd17c27022a8cd5e02f5c61..4c95d8772cff074467163f03374bdeb11690f926 100644 (file)
@@ -640,11 +640,16 @@ static apr_status_t ssl_io_input_read(bio_filter_in_ctx_t *inctx,
              */
             if (APR_STATUS_IS_EAGAIN(inctx->rc)
                     || APR_STATUS_IS_EINTR(inctx->rc)) {
-                /* Already read something, return APR_SUCCESS instead. */
-                if (*len > 0) {
-                    inctx->rc = APR_SUCCESS;
+                /* Already read something, return APR_SUCCESS instead. 
+                 * On win32 in particular, but perhaps on other kernels,
+                 * a blocking call isn't 'always' blocking.
+                 */
+                if (inctx->block == APR_NONBLOCK_READ) {
+                    if (*len > 0) {
+                        inctx->rc = APR_SUCCESS;
+                    }
+                    break;
                 }
-                break;
             }
             else {
                 if (*len > 0) {
@@ -684,10 +689,13 @@ static apr_status_t ssl_io_input_read(bio_filter_in_ctx_t *inctx,
                 if (APR_STATUS_IS_EAGAIN(inctx->rc)
                         || APR_STATUS_IS_EINTR(inctx->rc)) {
                     /* Already read something, return APR_SUCCESS instead. */
-                    if (*len > 0) {
-                        inctx->rc = APR_SUCCESS;
+                    if (inctx->block == APR_NONBLOCK_READ) {
+                        if (*len > 0) {
+                            inctx->rc = APR_SUCCESS;
+                        }
+                        break;
                     }
-                    break;
+                    continue;
                 }
                 else {
                     ap_log_error(APLOG_MARK, APLOG_ERR, inctx->rc, c->base_server,