]> git.proxmox.com Git - mirror_qemu.git/commitdiff
slirp: Handle error returns from sosendoob()
authorPeter Maydell <peter.maydell@linaro.org>
Fri, 14 Jul 2017 11:12:25 +0000 (12:12 +0100)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Sat, 15 Jul 2017 12:28:25 +0000 (14:28 +0200)
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>
slirp/sbuf.c
slirp/socket.c

index 10119d3ad590cc1ea0f0b46b017800c24b6edf8c..912f235f6524bf116e4ce687be5d1080d6f56710 100644 (file)
@@ -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;
        }
 
index a17caa9fa7a6497f0daa7e5290e18bbe13d7d143..ecec0295a9f47cacc86a7a0cbc9f55744eeec16f 100644 (file)
@@ -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;
 }
 
 /*