[nginx] Core: added limit to recv_chain().
Roman Arutyunyan
arut at nginx.com
Tue Oct 28 09:35:44 UTC 2014
details: http://hg.nginx.org/nginx/rev/ec81934727a1
branches:
changeset: 5882:ec81934727a1
user: Roman Arutyunyan <arut at nginx.com>
date: Tue Oct 28 12:29:58 2014 +0300
description:
Core: added limit to recv_chain().
diffstat:
src/event/ngx_event_openssl.c | 19 +++++++++++++++----
src/event/ngx_event_openssl.h | 2 +-
src/event/ngx_event_pipe.c | 2 +-
src/os/unix/ngx_aio_read_chain.c | 2 +-
src/os/unix/ngx_os.h | 7 ++++---
src/os/unix/ngx_readv_chain.c | 20 ++++++++++++++++----
src/os/win32/ngx_os.h | 5 +++--
src/os/win32/ngx_wsarecv_chain.c | 22 +++++++++++++++++-----
8 files changed, 58 insertions(+), 21 deletions(-)
diffs (227 lines):
diff -r ee9230cd4bda -r ec81934727a1 src/event/ngx_event_openssl.c
--- a/src/event/ngx_event_openssl.c Mon Oct 27 21:14:12 2014 +0300
+++ b/src/event/ngx_event_openssl.c Tue Oct 28 12:29:58 2014 +0300
@@ -1185,10 +1185,10 @@ ngx_ssl_handshake_handler(ngx_event_t *e
ssize_t
-ngx_ssl_recv_chain(ngx_connection_t *c, ngx_chain_t *cl)
+ngx_ssl_recv_chain(ngx_connection_t *c, ngx_chain_t *cl, off_t limit)
{
u_char *last;
- ssize_t n, bytes;
+ ssize_t n, bytes, size;
ngx_buf_t *b;
bytes = 0;
@@ -1197,8 +1197,19 @@ ngx_ssl_recv_chain(ngx_connection_t *c,
last = b->last;
for ( ;; ) {
-
- n = ngx_ssl_recv(c, last, b->end - last);
+ size = b->end - last;
+
+ if (limit) {
+ if (bytes >= limit) {
+ return bytes;
+ }
+
+ if (bytes + size > limit) {
+ size = (ssize_t) (limit - bytes);
+ }
+ }
+
+ n = ngx_ssl_recv(c, last, size);
if (n > 0) {
last += n;
diff -r ee9230cd4bda -r ec81934727a1 src/event/ngx_event_openssl.h
--- a/src/event/ngx_event_openssl.h Mon Oct 27 21:14:12 2014 +0300
+++ b/src/event/ngx_event_openssl.h Tue Oct 28 12:29:58 2014 +0300
@@ -194,7 +194,7 @@ ngx_int_t ngx_ssl_get_client_verify(ngx_
ngx_int_t ngx_ssl_handshake(ngx_connection_t *c);
ssize_t ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size);
ssize_t ngx_ssl_write(ngx_connection_t *c, u_char *data, size_t size);
-ssize_t ngx_ssl_recv_chain(ngx_connection_t *c, ngx_chain_t *cl);
+ssize_t ngx_ssl_recv_chain(ngx_connection_t *c, ngx_chain_t *cl, off_t limit);
ngx_chain_t *ngx_ssl_send_chain(ngx_connection_t *c, ngx_chain_t *in,
off_t limit);
void ngx_ssl_free_buffer(ngx_connection_t *c);
diff -r ee9230cd4bda -r ec81934727a1 src/event/ngx_event_pipe.c
--- a/src/event/ngx_event_pipe.c Mon Oct 27 21:14:12 2014 +0300
+++ b/src/event/ngx_event_pipe.c Tue Oct 28 12:29:58 2014 +0300
@@ -270,7 +270,7 @@ ngx_event_pipe_read_upstream(ngx_event_p
break;
}
- n = p->upstream->recv_chain(p->upstream, chain);
+ n = p->upstream->recv_chain(p->upstream, chain, 0);
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0,
"pipe recv chain: %z", n);
diff -r ee9230cd4bda -r ec81934727a1 src/os/unix/ngx_aio_read_chain.c
--- a/src/os/unix/ngx_aio_read_chain.c Mon Oct 27 21:14:12 2014 +0300
+++ b/src/os/unix/ngx_aio_read_chain.c Tue Oct 28 12:29:58 2014 +0300
@@ -11,7 +11,7 @@
ssize_t
-ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl)
+ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl, off_t limit)
{
int n;
u_char *buf, *prev;
diff -r ee9230cd4bda -r ec81934727a1 src/os/unix/ngx_os.h
--- a/src/os/unix/ngx_os.h Mon Oct 27 21:14:12 2014 +0300
+++ b/src/os/unix/ngx_os.h Tue Oct 28 12:29:58 2014 +0300
@@ -17,7 +17,8 @@
typedef ssize_t (*ngx_recv_pt)(ngx_connection_t *c, u_char *buf, size_t size);
-typedef ssize_t (*ngx_recv_chain_pt)(ngx_connection_t *c, ngx_chain_t *in);
+typedef ssize_t (*ngx_recv_chain_pt)(ngx_connection_t *c, ngx_chain_t *in,
+ off_t limit);
typedef ssize_t (*ngx_send_pt)(ngx_connection_t *c, u_char *buf, size_t size);
typedef ngx_chain_t *(*ngx_send_chain_pt)(ngx_connection_t *c, ngx_chain_t *in,
off_t limit);
@@ -41,7 +42,7 @@ ngx_int_t ngx_os_signal_process(ngx_cycl
ssize_t ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size);
-ssize_t ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *entry);
+ssize_t ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *entry, off_t limit);
ssize_t ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size);
ssize_t ngx_unix_send(ngx_connection_t *c, u_char *buf, size_t size);
ngx_chain_t *ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in,
@@ -49,7 +50,7 @@ ngx_chain_t *ngx_writev_chain(ngx_connec
#if (NGX_HAVE_AIO)
ssize_t ngx_aio_read(ngx_connection_t *c, u_char *buf, size_t size);
-ssize_t ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl);
+ssize_t ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl, off_t limit);
ssize_t ngx_aio_write(ngx_connection_t *c, u_char *buf, size_t size);
ngx_chain_t *ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in,
off_t limit);
diff -r ee9230cd4bda -r ec81934727a1 src/os/unix/ngx_readv_chain.c
--- a/src/os/unix/ngx_readv_chain.c Mon Oct 27 21:14:12 2014 +0300
+++ b/src/os/unix/ngx_readv_chain.c Tue Oct 28 12:29:58 2014 +0300
@@ -11,7 +11,7 @@
ssize_t
-ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain)
+ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain, off_t limit)
{
u_char *prev;
ssize_t n, size;
@@ -66,8 +66,20 @@ ngx_readv_chain(ngx_connection_t *c, ngx
/* coalesce the neighbouring bufs */
while (chain) {
+ n = chain->buf->end - chain->buf->last;
+
+ if (limit) {
+ if (size >= limit) {
+ break;
+ }
+
+ if (size + n > limit) {
+ n = (ssize_t) (limit - size);
+ }
+ }
+
if (prev == chain->buf->last) {
- iov->iov_len += chain->buf->end - chain->buf->last;
+ iov->iov_len += n;
} else {
if (vec.nelts >= IOV_MAX) {
@@ -80,10 +92,10 @@ ngx_readv_chain(ngx_connection_t *c, ngx
}
iov->iov_base = (void *) chain->buf->last;
- iov->iov_len = chain->buf->end - chain->buf->last;
+ iov->iov_len = n;
}
- size += chain->buf->end - chain->buf->last;
+ size += n;
prev = chain->buf->end;
chain = chain->next;
}
diff -r ee9230cd4bda -r ec81934727a1 src/os/win32/ngx_os.h
--- a/src/os/win32/ngx_os.h Mon Oct 27 21:14:12 2014 +0300
+++ b/src/os/win32/ngx_os.h Tue Oct 28 12:29:58 2014 +0300
@@ -17,7 +17,8 @@
typedef ssize_t (*ngx_recv_pt)(ngx_connection_t *c, u_char *buf, size_t size);
-typedef ssize_t (*ngx_recv_chain_pt)(ngx_connection_t *c, ngx_chain_t *in);
+typedef ssize_t (*ngx_recv_chain_pt)(ngx_connection_t *c, ngx_chain_t *in,
+ off_t limit);
typedef ssize_t (*ngx_send_pt)(ngx_connection_t *c, u_char *buf, size_t size);
typedef ngx_chain_t *(*ngx_send_chain_pt)(ngx_connection_t *c, ngx_chain_t *in,
off_t limit);
@@ -41,7 +42,7 @@ ssize_t ngx_overlapped_wsarecv(ngx_conne
ssize_t ngx_udp_wsarecv(ngx_connection_t *c, u_char *buf, size_t size);
ssize_t ngx_udp_overlapped_wsarecv(ngx_connection_t *c, u_char *buf,
size_t size);
-ssize_t ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain);
+ssize_t ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain, off_t limit);
ssize_t ngx_wsasend(ngx_connection_t *c, u_char *buf, size_t size);
ssize_t ngx_overlapped_wsasend(ngx_connection_t *c, u_char *buf, size_t size);
ngx_chain_t *ngx_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in,
diff -r ee9230cd4bda -r ec81934727a1 src/os/win32/ngx_wsarecv_chain.c
--- a/src/os/win32/ngx_wsarecv_chain.c Mon Oct 27 21:14:12 2014 +0300
+++ b/src/os/win32/ngx_wsarecv_chain.c Tue Oct 28 12:29:58 2014 +0300
@@ -14,12 +14,12 @@
ssize_t
-ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain)
+ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain, off_t limit)
{
int rc;
u_char *prev;
u_long bytes, flags;
- size_t size;
+ size_t n, size;
ngx_err_t err;
ngx_array_t vec;
ngx_event_t *rev;
@@ -41,8 +41,20 @@ ngx_wsarecv_chain(ngx_connection_t *c, n
/* coalesce the neighbouring bufs */
while (chain) {
+ n = chain->buf->end - chain->buf->last;
+
+ if (limit) {
+ if (size >= (size_t) limit) {
+ break;
+ }
+
+ if (size + n > (size_t) limit) {
+ n = (size_t) limit - size;
+ }
+ }
+
if (prev == chain->buf->last) {
- wsabuf->len += chain->buf->end - chain->buf->last;
+ wsabuf->len += n;
} else {
wsabuf = ngx_array_push(&vec);
@@ -51,10 +63,10 @@ ngx_wsarecv_chain(ngx_connection_t *c, n
}
wsabuf->buf = (char *) chain->buf->last;
- wsabuf->len = chain->buf->end - chain->buf->last;
+ wsabuf->len = n;
}
- size += chain->buf->end - chain->buf->last;
+ size += n;
prev = chain->buf->end;
chain = chain->next;
}
More information about the nginx-devel
mailing list