]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virStream*All: Call virStreamAbort() more frequently
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 1 Jun 2017 06:20:31 +0000 (08:20 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 11 Jul 2017 06:57:05 +0000 (08:57 +0200)
Our documentation to the virStreamRecvAll, virStreamSendAll,
virStreamSparseRecvAll, and virStreamSparseSendAll functions
indicates that if these functions fail, then virStreamAbort is
called. But that is not necessarily true. For instance all of
these functions allocate a buffer to work with. If the allocation
fails, no virStreamAbort() is called despite -1 being returned.
It's the same story with argument sanity checks and a lot of
other checks.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
src/libvirt-stream.c

index c49f20264fd7d33a486986b7664792d76aa923a5..b9125b66497e7e2f1f949ab00d09cedbce9e73e7 100644 (file)
@@ -217,8 +217,10 @@ virStreamSend(virStreamPtr stream,
  *     while (1) {
  *         char buf[1024];
  *         int got = virStreamRecv(st, buf, 1024);
- *         if (got < 0)
+ *         if (got < 0) {
+ *            virStreamAbort(st);
  *            break;
+ *         }
  *         if (got == 0) {
  *            virStreamFinish(st);
  *            break;
@@ -596,10 +598,8 @@ virStreamSendAll(virStreamPtr stream,
     for (;;) {
         int got, offset = 0;
         got = (handler)(stream, bytes, want, opaque);
-        if (got < 0) {
-            virStreamAbort(stream);
+        if (got < 0)
             goto cleanup;
-        }
         if (got == 0)
             break;
         while (offset < got) {
@@ -615,8 +615,10 @@ virStreamSendAll(virStreamPtr stream,
  cleanup:
     VIR_FREE(bytes);
 
-    if (ret != 0)
+    if (ret != 0) {
+        virStreamAbort(stream);
         virDispatchError(stream->conn);
+    }
 
     return ret;
 }
@@ -728,21 +730,16 @@ int virStreamSparseSendAll(virStreamPtr stream,
         const unsigned int skipFlags = 0;
 
         if (!dataLen) {
-            if (holeHandler(stream, &inData, &sectionLen, opaque) < 0) {
-                virStreamAbort(stream);
+            if (holeHandler(stream, &inData, &sectionLen, opaque) < 0)
                 goto cleanup;
-            }
 
             if (!inData && sectionLen) {
-                if (virStreamSendHole(stream, sectionLen, skipFlags) < 0) {
-                    virStreamAbort(stream);
+                if (virStreamSendHole(stream, sectionLen, skipFlags) < 0)
                     goto cleanup;
-                }
 
                 if (skipHandler(stream, sectionLen, opaque) < 0) {
                     virReportSystemError(errno, "%s",
                                          _("unable to skip hole"));
-                    virStreamAbort(stream);
                     goto cleanup;
                 }
                 continue;
@@ -755,10 +752,8 @@ int virStreamSparseSendAll(virStreamPtr stream,
             want = dataLen;
 
         got = (handler)(stream, bytes, want, opaque);
-        if (got < 0) {
-            virStreamAbort(stream);
+        if (got < 0)
             goto cleanup;
-        }
         if (got == 0)
             break;
         while (offset < got) {
@@ -775,8 +770,10 @@ int virStreamSparseSendAll(virStreamPtr stream,
  cleanup:
     VIR_FREE(bytes);
 
-    if (ret != 0)
+    if (ret != 0) {
+        virStreamAbort(stream);
         virDispatchError(stream->conn);
+    }
 
     return ret;
 }
@@ -857,10 +854,8 @@ virStreamRecvAll(virStreamPtr stream,
         while (offset < got) {
             int done;
             done = (handler)(stream, bytes + offset, got - offset, opaque);
-            if (done < 0) {
-                virStreamAbort(stream);
+            if (done < 0)
                 goto cleanup;
-            }
             offset += done;
         }
     }
@@ -869,8 +864,10 @@ virStreamRecvAll(virStreamPtr stream,
  cleanup:
     VIR_FREE(bytes);
 
-    if (ret != 0)
+    if (ret != 0) {
+        virStreamAbort(stream);
         virDispatchError(stream->conn);
+    }
 
     return ret;
 }
@@ -963,15 +960,11 @@ virStreamSparseRecvAll(virStreamPtr stream,
 
         got = virStreamRecvFlags(stream, bytes, want, flags);
         if (got == -3) {
-            if (virStreamRecvHole(stream, &holeLen, holeFlags) < 0) {
-                virStreamAbort(stream);
+            if (virStreamRecvHole(stream, &holeLen, holeFlags) < 0)
                 goto cleanup;
-            }
 
-            if (holeHandler(stream, holeLen, opaque) < 0) {
-                virStreamAbort(stream);
+            if (holeHandler(stream, holeLen, opaque) < 0)
                 goto cleanup;
-            }
             continue;
         } else if (got < 0) {
             goto cleanup;
@@ -981,10 +974,8 @@ virStreamSparseRecvAll(virStreamPtr stream,
         while (offset < got) {
             int done;
             done = (handler)(stream, bytes + offset, got - offset, opaque);
-            if (done < 0) {
-                virStreamAbort(stream);
+            if (done < 0)
                 goto cleanup;
-            }
             offset += done;
         }
     }
@@ -993,8 +984,10 @@ virStreamSparseRecvAll(virStreamPtr stream,
  cleanup:
     VIR_FREE(bytes);
 
-    if (ret != 0)
+    if (ret != 0) {
+        virStreamAbort(stream);
         virDispatchError(stream->conn);
+    }
 
     return ret;
 }