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