mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-01 17:35:17 +00:00
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
This commit is contained in:
parent
d550277ca7
commit
59b877b609
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user