From 59b877b609e809673c46bf1364864aa70ff13bb8 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 28 Jun 2011 17:42:06 +0100 Subject: [PATCH] Ensure empty payload is written upon stream completion 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 | 25 +++++++++++++++++++++++++ src/rpc/virnetmessage.h | 2 ++ src/rpc/virnetserverprogram.c | 5 ++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/rpc/virnetmessage.c b/src/rpc/virnetmessage.c index 62cdbc39c3..a7a25b158a 100644 --- a/src/rpc/virnetmessage.c +++ b/src/rpc/virnetmessage.c @@ -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 diff --git a/src/rpc/virnetmessage.h b/src/rpc/virnetmessage.h index 921511259b..2aae3f6499 100644 --- a/src/rpc/virnetmessage.h +++ b/src/rpc/virnetmessage.h @@ -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); diff --git a/src/rpc/virnetserverprogram.c b/src/rpc/virnetserverprogram.c index 0d1577a29b..4afed64c6e 100644 --- a/src/rpc/virnetserverprogram.c +++ b/src/rpc/virnetserverprogram.c @@ -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); } -- GitLab