summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2013-11-29 17:16:06 +0400
committerMaxim Dounin <mdounin@mdounin.ru>2013-11-29 17:16:06 +0400
commit79f0766f356d74f0331b9ff283b32408cf59adbb (patch)
treecf4b539539c44b9b15739f3fc68f0f12ad6ff5cb /src
parenta2d1c5f3b7bfcf0de83c2d25de461f85bb3e8999 (diff)
downloadnginx-79f0766f356d74f0331b9ff283b32408cf59adbb.tar.gz
nginx-79f0766f356d74f0331b9ff283b32408cf59adbb.tar.bz2
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.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c
index 62ce12c14..3e289cc5b 100644
--- a/src/event/ngx_event_openssl.c
+++ b/src/event/ngx_event_openssl.c
@@ -965,6 +965,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;
}
@@ -974,6 +975,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;
}