summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2007-08-27 19:44:35 +0000
committerIgor Sysoev <igor@sysoev.ru>2007-08-27 19:44:35 +0000
commit6fe1303fb5fe0bbaf709cb58155517b92c82d395 (patch)
tree184cf409da0d7745eb0ec1e4193dc13fde4c85db
parent121bf2f9559181bbf6584ef222ff64bf2cd9fe09 (diff)
downloadnginx-6fe1303fb5fe0bbaf709cb58155517b92c82d395.tar.gz
nginx-6fe1303fb5fe0bbaf709cb58155517b92c82d395.tar.bz2
do not set read->eof, ready, and error prematurely
-rw-r--r--src/event/ngx_event_openssl.c38
1 files changed, 25 insertions, 13 deletions
diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c
index de50b13ac..4971d9359 100644
--- a/src/event/ngx_event_openssl.c
+++ b/src/event/ngx_event_openssl.c
@@ -593,10 +593,13 @@ ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size)
int n, bytes;
if (c->ssl->last == NGX_ERROR) {
+ c->read->error = 1;
return NGX_ERROR;
}
if (c->ssl->last == NGX_DONE) {
+ c->read->ready = 0;
+ c->read->eof = 1;
return 0;
}
@@ -619,26 +622,38 @@ ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size)
c->ssl->last = ngx_ssl_handle_recv(c, n);
- if (c->ssl->last != NGX_OK) {
+ if (c->ssl->last == NGX_OK) {
+
+ size -= n;
- if (bytes) {
+ if (size == 0) {
return bytes;
}
- if (c->ssl->last == NGX_DONE) {
- return 0;
- }
+ buf += n;
- return c->ssl->last;
+ continue;
}
- size -= n;
-
- if (size == 0) {
+ if (bytes) {
return bytes;
}
- buf += n;
+ switch (c->ssl->last) {
+
+ case NGX_DONE:
+ c->read->ready = 0;
+ c->read->eof = 1;
+ return 0;
+
+ case NGX_ERROR:
+ c->read->error = 1;
+
+ /* fall thruogh */
+
+ case NGX_AGAIN:
+ return c->ssl->last;
+ }
}
}
@@ -703,8 +718,6 @@ ngx_ssl_handle_recv(ngx_connection_t *c, int n)
c->ssl->no_wait_shutdown = 1;
c->ssl->no_send_shutdown = 1;
- c->read->ready = 0;
- c->read->eof = 1;
if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) {
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
@@ -712,7 +725,6 @@ ngx_ssl_handle_recv(ngx_connection_t *c, int n)
return NGX_DONE;
}
- c->read->error = 1;
ngx_ssl_connection_error(c, sslerr, err, "SSL_read() failed");
return NGX_ERROR;