Fixed counting of sent bytes in the send chain functions on EINTR. Previously, a value of the "send" variable wasn't properly adjusted in a rare case when syscall was interrupted by a signal. As a result, these functions could send less data than the limit allows.
diff --git a/src/os/unix/ngx_darwin_sendfile_chain.c b/src/os/unix/ngx_darwin_sendfile_chain.c index dd574e5..8485f97 100644 --- a/src/os/unix/ngx_darwin_sendfile_chain.c +++ b/src/os/unix/ngx_darwin_sendfile_chain.c
@@ -308,6 +308,7 @@ in = ngx_handle_sent_chain(in, sent); if (eintr) { + send = prev_send + sent; continue; }
diff --git a/src/os/unix/ngx_freebsd_sendfile_chain.c b/src/os/unix/ngx_freebsd_sendfile_chain.c index f5d0f3a..88eacc2 100644 --- a/src/os/unix/ngx_freebsd_sendfile_chain.c +++ b/src/os/unix/ngx_freebsd_sendfile_chain.c
@@ -378,6 +378,7 @@ } if (eintr) { + send = prev_send + sent; continue; }
diff --git a/src/os/unix/ngx_linux_sendfile_chain.c b/src/os/unix/ngx_linux_sendfile_chain.c index 1060852..60867c5 100644 --- a/src/os/unix/ngx_linux_sendfile_chain.c +++ b/src/os/unix/ngx_linux_sendfile_chain.c
@@ -316,6 +316,7 @@ in = ngx_handle_sent_chain(in, sent); if (eintr) { + send = prev_send; continue; }
diff --git a/src/os/unix/ngx_solaris_sendfilev_chain.c b/src/os/unix/ngx_solaris_sendfilev_chain.c index ba328c8..1b71f1d 100644 --- a/src/os/unix/ngx_solaris_sendfilev_chain.c +++ b/src/os/unix/ngx_solaris_sendfilev_chain.c
@@ -200,6 +200,7 @@ in = ngx_handle_sent_chain(in, sent); if (eintr) { + send = prev_send + sent; continue; }
diff --git a/src/os/unix/ngx_writev_chain.c b/src/os/unix/ngx_writev_chain.c index 95af2da..c7b6ebf 100644 --- a/src/os/unix/ngx_writev_chain.c +++ b/src/os/unix/ngx_writev_chain.c
@@ -134,6 +134,7 @@ in = ngx_handle_sent_chain(in, sent); if (eintr) { + send = prev_send; continue; }