[libvirt] [PATCH] Fix emission of domain events messages

Daniel P. Berrange berrange at redhat.com
Wed Sep 30 13:34:46 UTC 2009


The code which updated the message length after writing the
payload wrote the updated length word in the wrong place since
the XDR object was given a buffer pointing to the start of the
header payload, rather than message start.

* daemon/remote.c: Fix updating of event message length so that
  we actually send the payload, not just the header
---
 daemon/remote.c |   14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/daemon/remote.c b/daemon/remote.c
index 6d4cc1c..2b58045 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -4559,17 +4559,19 @@ remoteDispatchDomainEventSend (struct qemud_client *client,
 
     /* Serialise the return header and event. */
     xdrmem_create (&xdr,
-                   msg->buffer + msg->bufferOffset,
-                   msg->bufferLength - msg->bufferOffset,
+                   msg->buffer,
+                   msg->bufferLength,
                    XDR_ENCODE);
 
-    if (!xdr_remote_domain_event_msg(&xdr, data))
+    /* Skip over the header we just wrote */
+    if (xdr_setpos (&xdr, msg->bufferOffset) == 0)
         goto xdr_error;
 
+    if (!xdr_remote_domain_event_msg(&xdr, data))
+        goto xdr_error;
 
-    /* Update length word */
-    msg->bufferOffset += xdr_getpos (&xdr);
-    len = msg->bufferOffset;
+    /* Update length word to include payload*/
+    len = msg->bufferOffset = xdr_getpos (&xdr);
     if (xdr_setpos (&xdr, 0) == 0)
         goto xdr_error;
 
-- 
1.6.2.5




More information about the libvir-list mailing list