diff options
author | Maxim Dounin <mdounin@mdounin.ru> | 2013-11-29 17:16:06 +0400 |
---|---|---|
committer | Maxim Dounin <mdounin@mdounin.ru> | 2013-11-29 17:16:06 +0400 |
commit | 067c1d2a4f48cbbaace59733c98007b793719f94 (patch) | |
tree | de7d396aa8de91c7cd9e025ca75f4e27105fb453 /src | |
parent | 6b7e88f36b2564b91fe68b1a5628d52a24384343 (diff) | |
download | nginx-067c1d2a4f48cbbaace59733c98007b793719f94.tar.gz nginx-067c1d2a4f48cbbaace59733c98007b793719f94.zip |
SSL: fixed c->read->ready handling in ngx_ssl_recv().
If c->read->ready was reset, but later some data were read from a socket
buffer due to a call to ngx_ssl_recv(), the c->read->ready flag should
be restored if not all data were read from OpenSSL buffers (as kernel
won't notify us about the data anymore).
More details are available here:
http://mailman.nginx.org/pipermail/nginx/2013-November/041178.html
Diffstat (limited to 'src')
-rw-r--r-- | src/event/ngx_event_openssl.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c index e4bc1a2c7..ee6671350 100644 --- a/src/event/ngx_event_openssl.c +++ b/src/event/ngx_event_openssl.c @@ -1025,6 +1025,7 @@ ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size) size -= n; if (size == 0) { + c->read->ready = 1; return bytes; } @@ -1034,6 +1035,10 @@ ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size) } if (bytes) { + if (c->ssl->last != NGX_AGAIN) { + c->read->ready = 1; + } + return bytes; } |