summaryrefslogtreecommitdiff
path: root/network_io/unix/sendrecv.c
diff options
context:
space:
mode:
Diffstat (limited to 'network_io/unix/sendrecv.c')
-rw-r--r--network_io/unix/sendrecv.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/network_io/unix/sendrecv.c b/network_io/unix/sendrecv.c
index b9e580b1b..1b965af50 100644
--- a/network_io/unix/sendrecv.c
+++ b/network_io/unix/sendrecv.c
@@ -196,13 +196,8 @@ apr_status_t apr_socket_sendv(apr_socket_t * sock, const struct iovec *vec,
{
#ifdef HAVE_WRITEV
apr_ssize_t rv;
- apr_size_t requested_len = 0;
apr_int32_t i;
- for (i = 0; i < nvec; i++) {
- requested_len += vec[i].iov_len;
- }
-
if (sock->options & APR_INCOMPLETE_WRITE) {
sock->options &= ~APR_INCOMPLETE_WRITE;
goto do_select;
@@ -231,8 +226,16 @@ do_select:
*len = 0;
return errno;
}
- if ((sock->timeout > 0) && (rv < requested_len)) {
- sock->options |= APR_INCOMPLETE_WRITE;
+ if (sock->timeout > 0) {
+ apr_size_t rv_len = rv;
+ for (i = 0; i < nvec; ++i) {
+ apr_size_t iov_len = vec[i].iov_len;
+ if (rv_len < iov_len) {
+ sock->options |= APR_INCOMPLETE_WRITE;
+ break;
+ }
+ rv_len -= iov_len;
+ }
}
(*len) = rv;
return APR_SUCCESS;