[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 4/4] slirp: Handle error returns from sosendoob()
From: |
Samuel Thibault |
Subject: |
[Qemu-devel] [PULL 4/4] slirp: Handle error returns from sosendoob() |
Date: |
Sat, 15 Jul 2017 14:30:57 +0200 |
From: Peter Maydell <address@hidden>
sosendoob() can return a failure code, but all its callers ignore it.
This is OK in sbappend(), as the comment there states -- we will try
again later in sowrite(). Add a (void) cast to tell Coverity so.
In sowrite() we do need to check the return value -- we should handle
a write failure in sosendoob() the same way we handle a write failure
for the normal data.
Signed-off-by: Peter Maydell <address@hidden>
Reviewed-by: Dr. David Alan Gilbert <address@hidden>
Signed-off-by: Samuel Thibault <address@hidden>
---
slirp/sbuf.c | 2 +-
slirp/socket.c | 23 +++++++++++++++++------
2 files changed, 18 insertions(+), 7 deletions(-)
diff --git a/slirp/sbuf.c b/slirp/sbuf.c
index 10119d3ad5..912f235f65 100644
--- a/slirp/sbuf.c
+++ b/slirp/sbuf.c
@@ -91,7 +91,7 @@ sbappend(struct socket *so, struct mbuf *m)
if (so->so_urgc) {
sbappendsb(&so->so_rcv, m);
m_free(m);
- sosendoob(so);
+ (void)sosendoob(so);
return;
}
diff --git a/slirp/socket.c b/slirp/socket.c
index a17caa9fa7..ecec0295a9 100644
--- a/slirp/socket.c
+++ b/slirp/socket.c
@@ -404,7 +404,15 @@ sowrite(struct socket *so)
DEBUG_ARG("so = %p", so);
if (so->so_urgc) {
- sosendoob(so);
+ uint32_t expected = so->so_urgc;
+ if (sosendoob(so) < expected) {
+ /* Treat a short write as a fatal error too,
+ * rather than continuing on and sending the urgent
+ * data as if it were non-urgent and leaving the
+ * so_urgc count wrong.
+ */
+ goto err_disconnected;
+ }
if (sb->sb_cc == 0)
return 0;
}
@@ -448,11 +456,7 @@ sowrite(struct socket *so)
return 0;
if (nn <= 0) {
- DEBUG_MISC((dfd, " --- sowrite disconnected, so->so_state = %x,
errno = %d\n",
- so->so_state, errno));
- sofcantsendmore(so);
- tcp_sockclosed(sototcpcb(so));
- return -1;
+ goto err_disconnected;
}
#ifndef HAVE_READV
@@ -479,6 +483,13 @@ sowrite(struct socket *so)
sofcantsendmore(so);
return nn;
+
+err_disconnected:
+ DEBUG_MISC((dfd, " --- sowrite disconnected, so->so_state = %x, errno =
%d\n",
+ so->so_state, errno));
+ sofcantsendmore(so);
+ tcp_sockclosed(sototcpcb(so));
+ return -1;
}
/*
--
2.13.2
- [Qemu-devel] [PULL 0/4] slirp updates, Samuel Thibault, 2017/07/15
- [Qemu-devel] [PULL 2/4] slirp: fork_exec(): Don't close() a negative number in fork_exec(), Samuel Thibault, 2017/07/15
- [Qemu-devel] [PULL 4/4] slirp: Handle error returns from sosendoob(),
Samuel Thibault <=
- [Qemu-devel] [PULL 1/4] slirp: use DIV_ROUND_UP, Samuel Thibault, 2017/07/15
- [Qemu-devel] [PULL 3/4] slirp: Handle error returns from slirp_send() in sosendoob(), Samuel Thibault, 2017/07/15
- Re: [Qemu-devel] [PULL 0/4] slirp updates, no-reply, 2017/07/15
- Re: [Qemu-devel] [PULL 0/4] slirp updates, Peter Maydell, 2017/07/17