Author: rhuijben
Date: Wed Nov  4 00:28:12 2015
New Revision: 1712447

URL: http://svn.apache.org/viewvc?rev=1712447&view=rev
Log:
Apply a simple hack to the MockHTTP server to make sure the SSL_read
and SSL_write calls follow the documentation:

[From man SSL_read()]
WARNING
       When an SSL_read() operation has to be repeated because of
       SSL_ERROR_WANT_READ or SSL_ERROR_WANT_WRITE, it must be repeated with
       the same arguments.

[From man SSL_write()]
WARNING
       When an SSL_write() operation has to be repeated because of
       SSL_ERROR_WANT_READ or SSL_ERROR_WANT_WRITE, it must be repeated with
       the same arguments.

       When calling SSL_write() with num=0 bytes to be sent the behaviour is
       undefined.


On Debian Jessy (which I installed after philipm noted problems there) I see
far more SSL_ERROR_WANT_READ and SSL_ERROR_WANT_WRITE cases than on my
system and a bit of test code showed that we don't follow these rules, when
playing with buffer offsets and readlines, etc.

* test/MockHTTPinC/MockHTTP_server.c
  (sslCtx_t): Create some buffers.
  (sslSocketWrite): Ensure that all writes on a socket use the same address.
  (sslSocketRead): Ensure that all reads on a socket use the same address.

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=1712447&r1=1712446&r2=1712447&view=diff
==============================================================================
--- serf/trunk/test/MockHTTPinC/MockHTTP_server.c (original)
+++ serf/trunk/test/MockHTTPinC/MockHTTP_server.c Wed Nov  4 00:28:12 2015
@@ -2230,6 +2230,8 @@ struct sslCtx_t {
     SSL* ssl;
     BIO *bio;
 
+    char read_buffer[8192];
+    char write_buffer[8192];
 };
 
 static int init_done = 0;
@@ -2718,8 +2720,15 @@ sslSocketWrite(_mhClientCtx_t *cctx, con
     sslCtx_t *ssl_ctx = cctx->ssl_ctx;
     int result, ssl_err;
 
+    if (*len > sizeof(ssl_ctx->write_buffer))
+      *len = sizeof(ssl_ctx->write_buffer);
+    memcpy(ssl_ctx->write_buffer, data, *len);
+
+    if (*len == 0)
+        return APR_SUCCESS;
+
     ssl_ctx->bio_status = APR_SUCCESS;
-    result = SSL_write(ssl_ctx->ssl, data, *len);
+    result = SSL_write(ssl_ctx->ssl, ssl_ctx->write_buffer, *len);
     if (result > 0) {
         *len = result;
         return APR_SUCCESS;
@@ -2773,10 +2782,14 @@ sslSocketRead(apr_socket_t *skt, void *b
     sslCtx_t *ssl_ctx = baton;
     int result;
 
+    if (*len > sizeof(ssl_ctx->read_buffer))
+      *len = sizeof(ssl_ctx->read_buffer);
+
     ssl_ctx->bio_status = APR_SUCCESS;
-    result = SSL_read(ssl_ctx->ssl, data, *len);
+    result = SSL_read(ssl_ctx->ssl, ssl_ctx->read_buffer, *len);
     if (result > 0) {
         *len = result;
+        memcpy(data, ssl_ctx->read_buffer, *len);
         return APR_SUCCESS;
     } else {
         int ssl_err;


Reply via email to