aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGleb Smirnoff <glebius@nginx.com>2013-08-08 15:06:39 +0400
committerGleb Smirnoff <glebius@nginx.com>2013-08-08 15:06:39 +0400
commit65e37b4a128e5c4fe88721c790fd6f5c13102a62 (patch)
tree13df7393a0d4f489ca50b6541e49cfb7a6bf09bb
parentbe27365bb10e255330d3baeda2b918ea9fd79b8e (diff)
downloadnginx-65e37b4a128e5c4fe88721c790fd6f5c13102a62.tar.gz
nginx-65e37b4a128e5c4fe88721c790fd6f5c13102a62.zip
Don't lose pointer to first nonempty buf in ngx_*_sendfile_chain().
In ngx_*_sendfile_chain() when calculating pointer to a first non-zero sized buf, use "in" as iterator. This fixes processing of zero sized buf(s) after EINTR. Otherwise function can return zero sized buf to caller, and later ngx_http_write_filter() logs warning.
-rw-r--r--src/os/unix/ngx_darwin_sendfile_chain.c30
-rw-r--r--src/os/unix/ngx_freebsd_sendfile_chain.c34
-rw-r--r--src/os/unix/ngx_linux_sendfile_chain.c30
-rw-r--r--src/os/unix/ngx_solaris_sendfilev_chain.c30
4 files changed, 58 insertions, 66 deletions
diff --git a/src/os/unix/ngx_darwin_sendfile_chain.c b/src/os/unix/ngx_darwin_sendfile_chain.c
index 078d10b24..76c4a3a4d 100644
--- a/src/os/unix/ngx_darwin_sendfile_chain.c
+++ b/src/os/unix/ngx_darwin_sendfile_chain.c
@@ -317,9 +317,9 @@ ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
c->sent += sent;
- for (cl = in; cl; cl = cl->next) {
+ for ( /* void */ ; in; in = in->next) {
- if (ngx_buf_special(cl->buf)) {
+ if (ngx_buf_special(in->buf)) {
continue;
}
@@ -327,28 +327,28 @@ ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
break;
}
- size = ngx_buf_size(cl->buf);
+ size = ngx_buf_size(in->buf);
if (sent >= size) {
sent -= size;
- if (ngx_buf_in_memory(cl->buf)) {
- cl->buf->pos = cl->buf->last;
+ if (ngx_buf_in_memory(in->buf)) {
+ in->buf->pos = in->buf->last;
}
- if (cl->buf->in_file) {
- cl->buf->file_pos = cl->buf->file_last;
+ if (in->buf->in_file) {
+ in->buf->file_pos = in->buf->file_last;
}
continue;
}
- if (ngx_buf_in_memory(cl->buf)) {
- cl->buf->pos += (size_t) sent;
+ if (ngx_buf_in_memory(in->buf)) {
+ in->buf->pos += (size_t) sent;
}
- if (cl->buf->in_file) {
- cl->buf->file_pos += sent;
+ if (in->buf->in_file) {
+ in->buf->file_pos += sent;
}
break;
@@ -360,13 +360,11 @@ ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
if (!complete) {
wev->ready = 0;
- return cl;
+ return in;
}
- if (send >= limit || cl == NULL) {
- return cl;
+ if (send >= limit || in == NULL) {
+ return in;
}
-
- in = cl;
}
}
diff --git a/src/os/unix/ngx_freebsd_sendfile_chain.c b/src/os/unix/ngx_freebsd_sendfile_chain.c
index f58b5c20f..b8665e042 100644
--- a/src/os/unix/ngx_freebsd_sendfile_chain.c
+++ b/src/os/unix/ngx_freebsd_sendfile_chain.c
@@ -368,9 +368,9 @@ ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
c->sent += sent;
- for (cl = in; cl; cl = cl->next) {
+ for ( /* void */ ; in; in = in->next) {
- if (ngx_buf_special(cl->buf)) {
+ if (ngx_buf_special(in->buf)) {
continue;
}
@@ -378,28 +378,28 @@ ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
break;
}
- size = ngx_buf_size(cl->buf);
+ size = ngx_buf_size(in->buf);
if (sent >= size) {
sent -= size;
- if (ngx_buf_in_memory(cl->buf)) {
- cl->buf->pos = cl->buf->last;
+ if (ngx_buf_in_memory(in->buf)) {
+ in->buf->pos = in->buf->last;
}
- if (cl->buf->in_file) {
- cl->buf->file_pos = cl->buf->file_last;
+ if (in->buf->in_file) {
+ in->buf->file_pos = in->buf->file_last;
}
continue;
}
- if (ngx_buf_in_memory(cl->buf)) {
- cl->buf->pos += (size_t) sent;
+ if (ngx_buf_in_memory(in->buf)) {
+ in->buf->pos += (size_t) sent;
}
- if (cl->buf->in_file) {
- cl->buf->file_pos += sent;
+ if (in->buf->in_file) {
+ in->buf->file_pos += sent;
}
break;
@@ -407,7 +407,7 @@ ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
#if (NGX_HAVE_AIO_SENDFILE)
if (c->busy_sendfile) {
- return cl;
+ return in;
}
#endif
@@ -421,7 +421,7 @@ ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
*/
wev->ready = 0;
- return cl;
+ return in;
}
if (eintr) {
@@ -430,13 +430,11 @@ ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
if (!complete) {
wev->ready = 0;
- return cl;
+ return in;
}
- if (send >= limit || cl == NULL) {
- return cl;
+ if (send >= limit || in == NULL) {
+ return in;
}
-
- in = cl;
}
}
diff --git a/src/os/unix/ngx_linux_sendfile_chain.c b/src/os/unix/ngx_linux_sendfile_chain.c
index 643855ed9..8c4d59c22 100644
--- a/src/os/unix/ngx_linux_sendfile_chain.c
+++ b/src/os/unix/ngx_linux_sendfile_chain.c
@@ -325,9 +325,9 @@ ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
c->sent += sent;
- for (cl = in; cl; cl = cl->next) {
+ for ( /* void */ ; in; in = in->next) {
- if (ngx_buf_special(cl->buf)) {
+ if (ngx_buf_special(in->buf)) {
continue;
}
@@ -335,28 +335,28 @@ ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
break;
}
- size = ngx_buf_size(cl->buf);
+ size = ngx_buf_size(in->buf);
if (sent >= size) {
sent -= size;
- if (ngx_buf_in_memory(cl->buf)) {
- cl->buf->pos = cl->buf->last;
+ if (ngx_buf_in_memory(in->buf)) {
+ in->buf->pos = in->buf->last;
}
- if (cl->buf->in_file) {
- cl->buf->file_pos = cl->buf->file_last;
+ if (in->buf->in_file) {
+ in->buf->file_pos = in->buf->file_last;
}
continue;
}
- if (ngx_buf_in_memory(cl->buf)) {
- cl->buf->pos += (size_t) sent;
+ if (ngx_buf_in_memory(in->buf)) {
+ in->buf->pos += (size_t) sent;
}
- if (cl->buf->in_file) {
- cl->buf->file_pos += sent;
+ if (in->buf->in_file) {
+ in->buf->file_pos += sent;
}
break;
@@ -368,13 +368,11 @@ ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
if (!complete) {
wev->ready = 0;
- return cl;
+ return in;
}
- if (send >= limit || cl == NULL) {
- return cl;
+ if (send >= limit || in == NULL) {
+ return in;
}
-
- in = cl;
}
}
diff --git a/src/os/unix/ngx_solaris_sendfilev_chain.c b/src/os/unix/ngx_solaris_sendfilev_chain.c
index 520eaaab4..37bb09d96 100644
--- a/src/os/unix/ngx_solaris_sendfilev_chain.c
+++ b/src/os/unix/ngx_solaris_sendfilev_chain.c
@@ -207,9 +207,9 @@ ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
c->sent += sent;
- for (cl = in; cl; cl = cl->next) {
+ for ( /* void */ ; in; in = in->next) {
- if (ngx_buf_special(cl->buf)) {
+ if (ngx_buf_special(in->buf)) {
continue;
}
@@ -217,28 +217,28 @@ ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
break;
}
- size = ngx_buf_size(cl->buf);
+ size = ngx_buf_size(in->buf);
if ((off_t) sent >= size) {
sent = (size_t) ((off_t) sent - size);
- if (ngx_buf_in_memory(cl->buf)) {
- cl->buf->pos = cl->buf->last;
+ if (ngx_buf_in_memory(in->buf)) {
+ in->buf->pos = in->buf->last;
}
- if (cl->buf->in_file) {
- cl->buf->file_pos = cl->buf->file_last;
+ if (in->buf->in_file) {
+ in->buf->file_pos = in->buf->file_last;
}
continue;
}
- if (ngx_buf_in_memory(cl->buf)) {
- cl->buf->pos += sent;
+ if (ngx_buf_in_memory(in->buf)) {
+ in->buf->pos += sent;
}
- if (cl->buf->in_file) {
- cl->buf->file_pos += sent;
+ if (in->buf->in_file) {
+ in->buf->file_pos += sent;
}
break;
@@ -250,13 +250,11 @@ ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
if (!complete) {
wev->ready = 0;
- return cl;
+ return in;
}
- if (send >= limit || cl == NULL) {
- return cl;
+ if (send >= limit || in == NULL) {
+ return in;
}
-
- in = cl;
}
}