[libvirt] [PATCH] Send back an error if we get unexpected stream control message

Daniel P. Berrange berrange at redhat.com
Thu Jun 30 16:10:23 UTC 2011


We ignore any stream data packets which come in for streams which
are not registered, since these packets are async and do not have
a reply. If we get a stream control packet though we must send back
an actual error, otherwise a (broken) client may hang forever
making it hard to diagnose the client bug.

* src/rpc/virnetserverprogram.c: Send back error for unexpected
  stream control messages
---
 src/rpc/virnetserverprogram.c |   25 +++++++++++++++++--------
 1 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/src/rpc/virnetserverprogram.c b/src/rpc/virnetserverprogram.c
index ca80ae0..63a6b6d 100644
--- a/src/rpc/virnetserverprogram.c
+++ b/src/rpc/virnetserverprogram.c
@@ -257,14 +257,23 @@ int virNetServerProgramDispatch(virNetServerProgramPtr prog,
          * stream packets after we closed down a stream. Just drop & ignore
          * these.
          */
-        VIR_INFO("Ignoring unexpected stream data serial=%d proc=%d status=%d",
-                 msg->header.serial, msg->header.proc, msg->header.status);
-        /* Send a dummy reply to free up 'msg' & unblock client rx */
-        memset(msg, 0, sizeof(*msg));
-        msg->header.type = VIR_NET_REPLY;
-        if (virNetServerClientSendMessage(client, msg) < 0) {
-            ret = -1;
-            goto cleanup;
+        if (msg->header.status == VIR_NET_CONTINUE) {
+            VIR_INFO("Ignoring unexpected stream data serial=%d proc=%d status=%d",
+                     msg->header.serial, msg->header.proc, msg->header.status);
+            /* Send a dummy reply to free up 'msg' & unblock client rx */
+            memset(msg, 0, sizeof(*msg));
+            msg->header.type = VIR_NET_REPLY;
+            if (virNetServerClientSendMessage(client, msg) < 0) {
+                ret = -1;
+                goto cleanup;
+            }
+        } else {
+            VIR_INFO("Unexpected stream control message serial=%d proc=%d status=%d",
+                     msg->header.serial, msg->header.proc, msg->header.status);
+            virNetError(VIR_ERR_RPC,
+                        _("Unexpected stream control message serial=%d proc=%d status=%d"),
+                          msg->header.serial, msg->header.proc, msg->header.status);
+            goto error;
         }
         ret = 0;
         break;
-- 
1.7.4.4




More information about the libvir-list mailing list