diff --git a/src/network_openssl.c b/src/network_openssl.c index 7e8e2f6a..21a556de 100644 --- a/src/network_openssl.c +++ b/src/network_openssl.c @@ -61,6 +61,12 @@ int network_write_chunkqueue_openssl(server *srv, connection *con, chunkqueue *c switch ((ssl_r = SSL_get_error(con->ssl, r))) { case SSL_ERROR_WANT_WRITE: break; + case SSL_ERROR_ZERO_RETURN: + /* clean shutdown on the remote side */ + + if (r == 0) return -2; + + /* fall thourgh */ default: log_error_write(srv, __FILE__, __LINE__, "sdds", "SSL:", ssl_r, r, @@ -88,7 +94,6 @@ int network_write_chunkqueue_openssl(server *srv, connection *con, chunkqueue *c char *p; # endif - WP(); if (HANDLER_GO_ON != file_cache_get_entry(srv, con, c->data.file.name, &(con->fce))) { log_error_write(srv, __FILE__, __LINE__, "sb", strerror(errno), c->data.file.name); @@ -124,6 +129,17 @@ int network_write_chunkqueue_openssl(server *srv, connection *con, chunkqueue *c switch ((ssl_r = SSL_get_error(con->ssl, r))) { case SSL_ERROR_WANT_WRITE: break; + case SSL_ERROR_ZERO_RETURN: + /* clean shutdown on the remote side */ + + if (r == 0) { +#if defined USE_MMAP + munmap(p, c->data.file.length); +#endif + return -2; + } + + /* fall thourgh */ default: log_error_write(srv, __FILE__, __LINE__, "sdds", "SSL:", ssl_r, r,