slirp: Handle error returns from sosendoob()
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 <peter.maydell@linaro.org> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
This commit is contained in:
parent
0b466065eb
commit
75cb298d90
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user