summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2007-12-20 12:59:05 +0000
committerIgor Sysoev <igor@sysoev.ru>2007-12-20 12:59:05 +0000
commit94b3ea319b25d81497218b90e8515d42881ca4c5 (patch)
treef28f2abef189d9bb206923fdf25c2c675a511617
parentafc57e0e5cb309b6adaaeb81d7c7e82499f503a4 (diff)
downloadnginx-94b3ea319b25d81497218b90e8515d42881ca4c5.tar.gz
nginx-94b3ea319b25d81497218b90e8515d42881ca4c5.tar.bz2
SSL_shutdown() never returns -1, on error it returns 0.
This fixes incidental "bad write retry" errors.
-rw-r--r--src/event/ngx_event_openssl.c45
1 files changed, 18 insertions, 27 deletions
diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c
index bd539c9a3..e4f92148f 100644
--- a/src/event/ngx_event_openssl.c
+++ b/src/event/ngx_event_openssl.c
@@ -978,9 +978,8 @@ ngx_ssl_read_handler(ngx_event_t *rev)
ngx_int_t
ngx_ssl_shutdown(ngx_connection_t *c)
{
- int n, sslerr, mode;
- ngx_err_t err;
- ngx_uint_t again;
+ int n, sslerr, mode;
+ ngx_err_t err;
if (c->timedout) {
mode = SSL_RECEIVED_SHUTDOWN|SSL_SENT_SHUTDOWN;
@@ -999,40 +998,32 @@ ngx_ssl_shutdown(ngx_connection_t *c)
SSL_set_shutdown(c->ssl->connection, mode);
- again = 0;
- sslerr = 0;
-
- for ( ;; ) {
- n = SSL_shutdown(c->ssl->connection);
-
- ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_shutdown: %d", n);
+ n = SSL_shutdown(c->ssl->connection);
- if (n == 1 || (n == 0 && c->timedout)) {
- SSL_free(c->ssl->connection);
- c->ssl = NULL;
+ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_shutdown: %d", n);
- return NGX_OK;
- }
-
- if (n == 0) {
- again = 1;
- break;
- }
+ sslerr = 0;
- break;
- }
+ /* SSL_shutdown() never return -1, on error it return 0 */
- if (!again) {
+ if (n != 1) {
sslerr = SSL_get_error(c->ssl->connection, n);
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
"SSL_get_error: %d", sslerr);
}
- if (again
- || sslerr == SSL_ERROR_WANT_READ
- || sslerr == SSL_ERROR_WANT_WRITE)
+ if (n == 1
+ || sslerr == SSL_ERROR_ZERO_RETURN
+ || (sslerr == 0 && c->timedout))
{
+ SSL_free(c->ssl->connection);
+ c->ssl = NULL;
+
+ return NGX_OK;
+ }
+
+ if (sslerr == SSL_ERROR_WANT_READ || sslerr == SSL_ERROR_WANT_WRITE) {
c->read->handler = ngx_ssl_shutdown_handler;
c->write->handler = ngx_ssl_shutdown_handler;
@@ -1044,7 +1035,7 @@ ngx_ssl_shutdown(ngx_connection_t *c)
return NGX_ERROR;
}
- if (again || sslerr == SSL_ERROR_WANT_READ) {
+ if (sslerr == SSL_ERROR_WANT_READ) {
ngx_add_timer(c->read, 30000);
}