[libvirt] [PATCH] Don't send back unknown program errors for async messages

Daniel P. Berrange berrange at redhat.com
Thu Oct 6 10:10:17 UTC 2011


From: "Daniel P. Berrange" <berrange at 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




More information about the libvir-list mailing list