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:
Michal Privoznik 2016-04-08 16:56:28 +02:00
parent 30898d80d7
commit 01acd6f52b

View File

@ -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;
} }