]> xenbits.xensource.com Git - libvirt.git/commitdiff
Fix release of outgoing stream confirmation/abort message
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 8 Jul 2011 11:37:22 +0000 (12:37 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Fri, 8 Jul 2011 15:19:57 +0000 (16:19 +0100)
When sending back the final OK or ERROR message on completion
of a stream, we were not decrementing the 'nrequests' tracker
on the client. With the default requests limit of '5', this
meant once a client had created 5 streams, they are unable to
process any further RPC calls.  There was also a bug when
handling an error from decoding a message length header, which
meant a client connection would not immediately be closed.

* src/rpc/virnetserverclient.c: Fix release of request after
  stream completion & mark client for close on error

src/rpc/virnetserverclient.c

index 30d7fcbd5d4cbf0e687116af8e8fffd6eea248d7..6aeb3a4d4ac004492aa00fde86466bceaecf3577 100644 (file)
@@ -700,8 +700,10 @@ readmore:
 
     /* Either done with length word header */
     if (client->rx->bufferLength == VIR_NET_MESSAGE_LEN_MAX) {
-        if (virNetMessageDecodeLength(client->rx) < 0)
+        if (virNetMessageDecodeLength(client->rx) < 0) {
+            client->wantClose = true;
             return;
+        }
 
         virNetServerClientUpdateEvent(client);
 
@@ -831,7 +833,9 @@ virNetServerClientDispatchWrite(virNetServerClientPtr client)
             /* Get finished msg from head of tx queue */
             msg = virNetMessageQueueServe(&client->tx);
 
-            if (msg->header.type == VIR_NET_REPLY) {
+            if (msg->header.type == VIR_NET_REPLY ||
+                (msg->header.type == VIR_NET_STREAM &&
+                 msg->header.status != VIR_NET_CONTINUE)) {
                 client->nrequests--;
                 /* See if the recv queue is currently throttled */
                 if (!client->rx &&