]> xenbits.xensource.com Git - libvirt.git/commitdiff
daemonStreamHandleWriteData: Preserve error when aborting stream
authorMichal Privoznik <mprivozn@redhat.com>
Mon, 12 Mar 2018 09:18:05 +0000 (10:18 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 15 Mar 2018 07:25:59 +0000 (08:25 +0100)
The daemonStreamHandleWriteData() function is called whenever
server side of stream is able to receive some data. Nevertheless,
it calls virStreamSend() (to pass data down to virFDStream) and
depending on its return value it may abort the stream. However,
the functions it called when doing so are public APIs and as such
reset any error set previously. Therefore, if there was any error
in writing data to stream (i.e. repored in virStreamSend) it is
reset before virNetServerProgramSendReplyError() can get to it.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
src/remote/remote_daemon_stream.c

index 4dd3af9e0d590ad3921d9c53866b69aeab3d4344..14472ced22d8998d6ced3ea42cc1156c134f1d32 100644 (file)
@@ -549,8 +549,9 @@ daemonStreamHandleWriteData(virNetServerClientPtr client,
     } else if (ret == -2) {
         /* Blocking, so indicate we have more todo later */
         return 1;
-    } else {
+    } else if (ret < 0) {
         virNetMessageError rerr;
+        virErrorPtr err = virSaveLastError();
 
         memset(&rerr, 0, sizeof(rerr));
 
@@ -559,6 +560,11 @@ daemonStreamHandleWriteData(virNetServerClientPtr client,
         virStreamEventRemoveCallback(stream->st);
         virStreamAbort(stream->st);
 
+        if (err) {
+            virSetError(err);
+            virFreeError(err);
+        }
+
         return virNetServerProgramSendReplyError(stream->prog,
                                                  client,
                                                  msg,