mirror of
https://github.com/nginx/nginx.git
synced 2024-12-20 06:03:31 -06:00
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.
This commit is contained in:
parent
be27365bb1
commit
65e37b4a12
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user