From 696becb658b5faf84a1f7850cfb9df4dbb0e0fc4 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Thu, 6 Oct 2011 10:58:05 +0100 Subject: [PATCH] Don't send back unknown program errors for async messages If we send back an unknown program error for async messages, we will confuse the client because they only expect replies for method calls. Just log & drop any invalid async messages * src/rpc/virnetserver.c: Don't send error for async messages --- src/rpc/virnetserver.c | 23 +++++++++++++++++++---- src/rpc/virnetserverprogram.c | 13 ++++++++++++- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c index 9588077334..f7397439b1 100644 --- a/src/rpc/virnetserver.c +++ b/src/rpc/virnetserver.c @@ -134,10 +134,25 @@ static void virNetServerHandleJob(void *jobOpaque, void *opaque) srv, job->client, job->msg, job->prog); if (!job->prog) { - if (virNetServerProgramUnknownError(job->client, - job->msg, - &job->msg->header) < 0) - goto error; + /* Only send back an error for type == CALL. Other + * message types are not expecting replies, so we + * must just log it & drop them + */ + if (job->msg->header.type == VIR_NET_CALL) { + if (virNetServerProgramUnknownError(job->client, + job->msg, + &job->msg->header) < 0) + goto error; + } else { + VIR_INFO("Dropping client mesage, unknown program %d version %d type %d proc %d", + job->msg->header.prog, job->msg->header.vers, + job->msg->header.type, job->msg->header.proc); + /* Send a dummy reply to free up 'msg' & unblock client rx */ + virNetMessageClear(job->msg); + job->msg->header.type = VIR_NET_REPLY; + if (virNetServerClientSendMessage(job->client, job->msg) < 0) + goto error; + } goto cleanup; } diff --git a/src/rpc/virnetserverprogram.c b/src/rpc/virnetserverprogram.c index 334a0bf7a5..47b7deda77 100644 --- a/src/rpc/virnetserverprogram.c +++ b/src/rpc/virnetserverprogram.c @@ -314,7 +314,18 @@ int virNetServerProgramDispatch(virNetServerProgramPtr prog, return ret; error: - ret = virNetServerProgramSendReplyError(prog, client, msg, &rerr, &msg->header); + if (msg->header.type == VIR_NET_CALL) { + ret = virNetServerProgramSendReplyError(prog, client, msg, &rerr, &msg->header); + } else { + /* Send a dummy reply to free up 'msg' & unblock client rx */ + virNetMessageClear(msg); + msg->header.type = VIR_NET_REPLY; + if (virNetServerClientSendMessage(client, msg) < 0) { + ret = -1; + goto cleanup; + } + ret = 0; + } cleanup: return ret; -- GitLab