aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2020-02-14 05:33:46 +0000
committerAndrew Yourtchenko <ayourtch@gmail.com>2020-08-12 15:59:46 +0000
commite0208837b53362b343b44275d281ba5cb76a79b6 (patch)
treee378b96d70cbcb41bab87007160ee567a2228e93
parent0bd543b2a93c01b08d2b60ad6efd2ca1bf1c069a (diff)
vcl: fix ldp read on closing session
Type: fix Signed-off-by: Florin Coras <fcoras@cisco.com> Change-Id: I60be191866d20721951ad22f571a2a3275511e12 (cherry picked from commit 067f9544d52c95c0b60b0e8425fce1e295120180)
-rw-r--r--src/vcl/ldp.c21
-rw-r--r--src/vcl/vcl_private.h4
2 files changed, 10 insertions, 15 deletions
diff --git a/src/vcl/ldp.c b/src/vcl/ldp.c
index 34eba377451..a4151be9f2e 100644
--- a/src/vcl/ldp.c
+++ b/src/vcl/ldp.c
@@ -380,24 +380,19 @@ readv (int fd, const struct iovec * iov, int iovcnt)
vlsh = ldp_fd_to_vlsh (fd);
if (vlsh != VLS_INVALID_HANDLE)
{
- do
+ for (i = 0; i < iovcnt; ++i)
{
- for (i = 0; i < iovcnt; ++i)
+ rv = vls_read (vlsh, iov[i].iov_base, iov[i].iov_len);
+ if (rv <= 0)
+ break;
+ else
{
- rv = vls_read (vlsh, iov[i].iov_base, iov[i].iov_len);
- if (rv < 0)
+ total += rv;
+ if (rv < iov[i].iov_len)
break;
- else
- {
- total += rv;
- if (rv < iov[i].iov_len)
- break;
- }
}
}
- while ((rv >= 0) && (total == 0));
-
- if (rv < 0)
+ if (rv < 0 && total == 0)
{
errno = -rv;
size = -1;
diff --git a/src/vcl/vcl_private.h b/src/vcl/vcl_private.h
index d44d993e0a1..0cd6a6c7944 100644
--- a/src/vcl/vcl_private.h
+++ b/src/vcl/vcl_private.h
@@ -537,8 +537,8 @@ vcl_session_is_closing (vcl_session_t * s)
static inline int
vcl_session_closing_error (vcl_session_t * s)
{
- return s->session_state == STATE_DISCONNECT
- ? VPPCOM_ECONNRESET : VPPCOM_ECONNABORTED;
+ /* Return 0 on closing sockets */
+ return s->session_state == STATE_DISCONNECT ? VPPCOM_ECONNRESET : 0;
}
static inline int