From 984840a2c292402926ad100aeea33f8859ff31a9 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 16 Aug 2011 16:22:44 -0700 Subject: [PATCH] Ensure async packets never get marked for sync replies If a client had initiated a stream abort, it will have a call waiting for a reply in the queue. If more data continues to arrive on the stream, the abort command could mistakenly get signalled as complete. Remove the code from async data processing that looked for waiting calls. Add a sanity check to ensure no async call can ever be marked as needing a reply * src/rpc/virnetclient.c: Ensure async data packets can't trigger a reply --- src/rpc/virnetclient.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c index efaac88d26..055361d0da 100644 --- a/src/rpc/virnetclient.c +++ b/src/rpc/virnetclient.c @@ -627,11 +627,6 @@ static int virNetClientCallDispatchStream(virNetClientPtr client) case VIR_NET_CONTINUE: { if (virNetClientStreamQueuePacket(st, &client->msg) < 0) return -1; - - if (thecall && thecall->expectReply) { - VIR_DEBUG("Got sync data packet completion"); - thecall->mode = VIR_NET_CLIENT_MODE_COMPLETE; - } return 0; } @@ -1193,6 +1188,13 @@ int virNetClientSend(virNetClientPtr client, virNetClientCallPtr call; int ret = -1; + if (expectReply && + (msg->header.status == VIR_NET_CONTINUE)) { + virNetError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Attempt to send an asynchronous message with a synchronous reply")); + return -1; + } + if (VIR_ALLOC(call) < 0) { virReportOOMError(); return -1; -- GitLab