From: "Daniel P. Berrange" <berrange(a)redhat.com>
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 9588077..f739743 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 334a0bf..47b7ded 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;
--
1.7.6.2