aboutsummaryrefslogtreecommitdiff
path: root/src/os/unix/ngx_readv_chain.c
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2012-04-17 09:13:58 +0000
committerMaxim Dounin <mdounin@mdounin.ru>2012-04-17 09:13:58 +0000
commit0abb0bce5f297546f8f982677707fb33dadb96d8 (patch)
treedd5508c9ca4fdd3f68681410c96344537158cc2e /src/os/unix/ngx_readv_chain.c
parent578c02f3a1fda0ad43277af2af022c24f2e74104 (diff)
downloadnginx-0abb0bce5f297546f8f982677707fb33dadb96d8.tar.gz
nginx-0abb0bce5f297546f8f982677707fb33dadb96d8.zip
Fixed ngx_readv_chain() to honor IOV_MAX (ticket #14).
Not using full chain passed is ok as consumers are expected to check event's ready flag to determine if another call is needed, not the returned size.
Diffstat (limited to 'src/os/unix/ngx_readv_chain.c')
-rw-r--r--src/os/unix/ngx_readv_chain.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/os/unix/ngx_readv_chain.c b/src/os/unix/ngx_readv_chain.c
index 373c4027c..7b6badfa8 100644
--- a/src/os/unix/ngx_readv_chain.c
+++ b/src/os/unix/ngx_readv_chain.c
@@ -71,6 +71,10 @@ ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain)
iov->iov_len += chain->buf->end - chain->buf->last;
} else {
+ if (vec.nelts >= IOV_MAX) {
+ break;
+ }
+
iov = ngx_array_push(&vec);
if (iov == NULL) {
return NGX_ERROR;
@@ -195,6 +199,10 @@ ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain)
iov->iov_len += chain->buf->end - chain->buf->last;
} else {
+ if (vec.nelts >= IOV_MAX) {
+ break;
+ }
+
iov = ngx_array_push(&vec);
if (iov == NULL) {
return NGX_ERROR;