]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Ensure empty payload is written upon stream completion
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 28 Jun 2011 16:42:06 +0000 (17:42 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Wed, 29 Jun 2011 10:08:59 +0000 (11:08 +0100)
On stream completion it is neccessary to send back a
message with an empty payload. The message header was
not being filled out correctly, since we were not writing
any payload. Add a method for encoding an empty payload
which updates the message headers correctly.

* src/rpc/virnetmessage.c, src/rpc/virnetmessage.h: Add
  a virNetMessageEncodePayloadEmpty method
* src/rpc/virnetserverprogram.c: Write empty payload on
  stream completion

src/rpc/virnetmessage.c
src/rpc/virnetmessage.h
src/rpc/virnetserverprogram.c

index 62cdbc39c3f021dc0ee76b000c781d5ec624b6bd..a7a25b158ae30b4f0618cc0f88b74d36fd24a1b4 100644 (file)
@@ -334,6 +334,31 @@ error:
 }
 
 
+int virNetMessageEncodePayloadEmpty(virNetMessagePtr msg)
+{
+    XDR xdr;
+    unsigned int msglen;
+
+    /* Re-encode the length word. */
+    VIR_DEBUG("Encode length as %zu", msg->bufferOffset);
+    xdrmem_create(&xdr, msg->buffer, VIR_NET_MESSAGE_HEADER_XDR_LEN, XDR_ENCODE);
+    msglen = msg->bufferOffset;
+    if (!xdr_u_int(&xdr, &msglen)) {
+        virNetError(VIR_ERR_RPC, "%s", _("Unable to encode message length"));
+        goto error;
+    }
+    xdr_destroy(&xdr);
+
+    msg->bufferLength = msg->bufferOffset;
+    msg->bufferOffset = 0;
+    return 0;
+
+error:
+    xdr_destroy(&xdr);
+    return -1;
+}
+
+
 void virNetMessageSaveError(virNetMessageErrorPtr rerr)
 {
     /* This func may be called several times & the first
index 921511259b61338692edd2c48251a0eb336db6cd..2aae3f6499ce1476c7c3eae44bf2c43ecebf27da 100644 (file)
@@ -78,6 +78,8 @@ int virNetMessageEncodePayloadRaw(virNetMessagePtr msg,
                                   const char *buf,
                                   size_t len)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
+int virNetMessageEncodePayloadEmpty(virNetMessagePtr msg)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
 
 void virNetMessageSaveError(virNetMessageErrorPtr rerr)
     ATTRIBUTE_NONNULL(1);
index 0d1577a29bcd04c6e630892441bbe627a6470233..4afed64c6e118f837d5a18ff20e1d6eba23f2321 100644 (file)
@@ -433,8 +433,11 @@ int virNetServerProgramSendStreamData(virNetServerProgramPtr prog,
         if (virNetMessageEncodePayloadRaw(msg, data, len) < 0)
             return -1;
 
-        VIR_DEBUG("Total %zu", msg->bufferOffset);
+    } else {
+        if (virNetMessageEncodePayloadEmpty(msg) < 0)
+            return -1;
     }
+    VIR_DEBUG("Total %zu", msg->bufferOffset);
 
     return virNetServerClientSendMessage(client, msg);
 }