Author: rhuijben
Date: Tue Nov  3 23:29:19 2015
New Revision: 1712439

URL: http://svn.apache.org/viewvc?rev=1712439&view=rev
Log:
An ssl write operation can trigger a read, so let's also check for errors
on writing.

* test/MockHTTPinC/MockHTTP_server.c
  (sslSocketWrite): Copy some code from sslSocketRead.
     Handle SSL_ERROR_ZERO_RETURN.
  (sslSocketRead): Handle a few more cases.

Modified:
    serf/trunk/test/MockHTTPinC/MockHTTP_server.c

Modified: serf/trunk/test/MockHTTPinC/MockHTTP_server.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/test/MockHTTPinC/MockHTTP_server.c?rev=1712439&r1=1712438&r2=1712439&view=diff
==============================================================================
--- serf/trunk/test/MockHTTPinC/MockHTTP_server.c (original)
+++ serf/trunk/test/MockHTTPinC/MockHTTP_server.c Tue Nov  3 23:29:19 2015
@@ -2715,8 +2715,8 @@ static apr_status_t initSSLCtx(_mhClient
 static apr_status_t
 sslSocketWrite(_mhClientCtx_t *cctx, const char *data, apr_size_t *len)
 {
-    int result;
     sslCtx_t *ssl_ctx = cctx->ssl_ctx;
+    int result, ssl_err;
 
     ssl_ctx->bio_status = APR_SUCCESS;
     result = SSL_write(ssl_ctx->ssl, data, *len);
@@ -2725,10 +2725,40 @@ sslSocketWrite(_mhClientCtx_t *cctx, con
         return APR_SUCCESS;
     }
 
+    ssl_err = SSL_get_error(ssl_ctx->ssl, result);
+    switch (ssl_err) {
+      case SSL_ERROR_ZERO_RETURN:
+        *len = 0;
+        return APR_EOF; /* Clean SSL shutdown */
+      case SSL_ERROR_SYSCALL:
+        /* error in bio_bucket_read, probably APR_EAGAIN or APR_EOF */
+        *len = 0;
+        return ssl_ctx->bio_status;
+      case SSL_ERROR_WANT_READ:
+      case SSL_ERROR_WANT_WRITE:
+        *len = 0;
+        return APR_EAGAIN;
+      case SSL_ERROR_SSL:
+        /* When the client kills the connection, we can expect protocol
+        errors... Let's just return that we didn't see an error,
+        but that the connection was closed. */
+        *len = 0;
+        return APR_EOF;
+      default:
+        *len = 0;
+        _mhLog(MH_VERBOSE, cctx->skt,
+               "sslSocketWrite SSL Error %d: ", ssl_err);
+#if MH_VERBOSE
+        ERR_print_errors_fp(stderr);
+#endif
+        return APR_EGENERAL;
+    }
+
+
     if (result == 0)
         return APR_EAGAIN;
 
-    _mhLog(MH_VERBOSE, cctx->skt, "ssl_socket_write: ssl error?\n");
+    
 
     return ssl_ctx->bio_status ? ssl_ctx->bio_status : APR_EGENERAL;
 }
@@ -2753,11 +2783,15 @@ sslSocketRead(apr_socket_t *skt, void *b
 
         ssl_err = SSL_get_error(ssl_ctx->ssl, result);
         switch (ssl_err) {
+            case SSL_ERROR_ZERO_RETURN:
+                *len = 0;
+                return APR_EOF; /* Clean SSL shutdown */
             case SSL_ERROR_SYSCALL:
                 /* error in bio_bucket_read, probably APR_EAGAIN or APR_EOF */
                 *len = 0;
                 return ssl_ctx->bio_status;
             case SSL_ERROR_WANT_READ:
+            case SSL_ERROR_WANT_WRITE:
                 *len = 0;
                 return APR_EAGAIN;
             case SSL_ERROR_SSL:
@@ -2769,7 +2803,7 @@ sslSocketRead(apr_socket_t *skt, void *b
             default:
                 *len = 0;
                 _mhLog(MH_VERBOSE, skt,
-                          "ssl_socket_read SSL Error %d: ", ssl_err);
+                          "sslSocketRead SSL Error %d: ", ssl_err);
 #if MH_VERBOSE
                 ERR_print_errors_fp(stderr);
 #endif


Reply via email to