mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-07-31 14:07:16 +00:00
daemonStreamHandleRead: Rework to follow our coding pattern
Usually, we have this 'if() goto cleanup;' pattern in our new code. It is going to be useful here too. Thing is, there was a memleak. If there has been an error in virNetServerProgramSendStreamError() or virNetServerProgramSendStreamData() created message was never freed. Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
30898d80d7
commit
01acd6f52b
@ -709,9 +709,12 @@ static int
|
|||||||
daemonStreamHandleRead(virNetServerClientPtr client,
|
daemonStreamHandleRead(virNetServerClientPtr client,
|
||||||
daemonClientStream *stream)
|
daemonClientStream *stream)
|
||||||
{
|
{
|
||||||
|
virNetMessagePtr msg = NULL;
|
||||||
|
virNetMessageError rerr;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
size_t bufferLen = VIR_NET_MESSAGE_LEGACY_PAYLOAD_MAX;
|
size_t bufferLen = VIR_NET_MESSAGE_LEGACY_PAYLOAD_MAX;
|
||||||
int ret;
|
int ret = -1;
|
||||||
|
int rv;
|
||||||
|
|
||||||
VIR_DEBUG("client=%p, stream=%p tx=%d closed=%d",
|
VIR_DEBUG("client=%p, stream=%p tx=%d closed=%d",
|
||||||
client, stream, stream->tx, stream->closed);
|
client, stream, stream->tx, stream->closed);
|
||||||
@ -728,50 +731,48 @@ daemonStreamHandleRead(virNetServerClientPtr client,
|
|||||||
if (!stream->tx)
|
if (!stream->tx)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
memset(&rerr, 0, sizeof(rerr));
|
||||||
|
|
||||||
if (VIR_ALLOC_N(buffer, bufferLen) < 0)
|
if (VIR_ALLOC_N(buffer, bufferLen) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
ret = virStreamRecv(stream->st, buffer, bufferLen);
|
if (!(msg = virNetMessageNew(false)))
|
||||||
if (ret == -2) {
|
goto cleanup;
|
||||||
|
|
||||||
|
rv = virStreamRecv(stream->st, buffer, bufferLen);
|
||||||
|
if (rv == -2) {
|
||||||
/* Should never get this, since we're only called when we know
|
/* Should never get this, since we're only called when we know
|
||||||
* we're readable, but hey things change... */
|
* we're readable, but hey things change... */
|
||||||
ret = 0;
|
} else if (rv < 0) {
|
||||||
} else if (ret < 0) {
|
if (virNetServerProgramSendStreamError(remoteProgram,
|
||||||
virNetMessagePtr msg;
|
client,
|
||||||
virNetMessageError rerr;
|
msg,
|
||||||
|
&rerr,
|
||||||
memset(&rerr, 0, sizeof(rerr));
|
stream->procedure,
|
||||||
|
stream->serial) < 0)
|
||||||
if (!(msg = virNetMessageNew(false)))
|
goto cleanup;
|
||||||
ret = -1;
|
msg = NULL;
|
||||||
else
|
|
||||||
ret = virNetServerProgramSendStreamError(remoteProgram,
|
|
||||||
client,
|
|
||||||
msg,
|
|
||||||
&rerr,
|
|
||||||
stream->procedure,
|
|
||||||
stream->serial);
|
|
||||||
} else {
|
} else {
|
||||||
virNetMessagePtr msg;
|
|
||||||
stream->tx = false;
|
stream->tx = false;
|
||||||
if (ret == 0)
|
if (rv == 0)
|
||||||
stream->recvEOF = true;
|
stream->recvEOF = true;
|
||||||
if (!(msg = virNetMessageNew(false)))
|
|
||||||
ret = -1;
|
|
||||||
|
|
||||||
if (msg) {
|
msg->cb = daemonStreamMessageFinished;
|
||||||
msg->cb = daemonStreamMessageFinished;
|
msg->opaque = stream;
|
||||||
msg->opaque = stream;
|
stream->refs++;
|
||||||
stream->refs++;
|
if (virNetServerProgramSendStreamData(remoteProgram,
|
||||||
ret = virNetServerProgramSendStreamData(remoteProgram,
|
client,
|
||||||
client,
|
msg,
|
||||||
msg,
|
stream->procedure,
|
||||||
stream->procedure,
|
stream->serial,
|
||||||
stream->serial,
|
buffer, rv) < 0)
|
||||||
buffer, ret);
|
goto cleanup;
|
||||||
}
|
msg = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
cleanup:
|
||||||
VIR_FREE(buffer);
|
VIR_FREE(buffer);
|
||||||
|
virNetMessageFree(msg);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user