]> xenbits.xensource.com Git - libvirt.git/commitdiff
Don't send back unknown program errors for async messages
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 6 Oct 2011 09:58:05 +0000 (10:58 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Fri, 7 Oct 2011 15:53:36 +0000 (16:53 +0100)
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
src/rpc/virnetserverprogram.c

index 95880773347c716311fe5edbca923feb629ac296..f7397439b1252898b7f0542ea234c36a654e6aab 100644 (file)
@@ -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;
     }
 
index 334a0bf7a5da0ea24d0f8373ce0e2502b3522ee0..47b7deda77acfa935afdb6b75cee4dcac6ae17fe 100644 (file)
@@ -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;