]> xenbits.xensource.com Git - libvirt.git/commitdiff
rpc: use virNetMessageClearPayload in client
authorCole Robinson <crobinso@redhat.com>
Wed, 27 Apr 2016 22:02:22 +0000 (18:02 -0400)
committerCole Robinson <crobinso@redhat.com>
Thu, 5 May 2016 18:28:19 +0000 (14:28 -0400)
This removes the opencoded payload freeing in the client, to use
the shared virNetMessageClearPayload call. Two changes:

- ClearPayload sets nfds=0, which fixes a potential crash if
  an error path called virNetMessageFree/Clear on the message
  after fds was free'd
- We drop the inner loop VIR_FORCE_CLOSE... this may mean fds are
  kept open a little bit longer if the call is blocking but in
  practice I don't think it will have any effect

src/libvirt_remote.syms
src/rpc/virnetclient.c
src/rpc/virnetmessage.c
src/rpc/virnetmessage.h

index afcb2b75567e282738934f01ca19fccd350c05ef..6b098b4bea0403b8183b41ed199592795c503695 100644 (file)
@@ -79,6 +79,7 @@ virNetDaemonUpdateServices;
 
 # rpc/virnetmessage.h
 virNetMessageClear;
+virNetMessageClearPayload;
 virNetMessageDecodeHeader;
 virNetMessageDecodeLength;
 virNetMessageDecodeNumFDs;
index 26b02fa94484c6d3018f1929805dba6dc9b50dd2..3d599903ec58632e3b5203ae9002bb2c97166bc4 100644 (file)
@@ -1194,12 +1194,8 @@ virNetClientIOWriteMessage(virNetClientPtr client,
             if (rv == 0) /* Blocking */
                 return 0;
             thecall->msg->donefds++;
-            VIR_FORCE_CLOSE(thecall->msg->fds[i]);
         }
-        thecall->msg->donefds = 0;
-        thecall->msg->bufferOffset = thecall->msg->bufferLength = 0;
-        VIR_FREE(thecall->msg->fds);
-        VIR_FREE(thecall->msg->buffer);
+        virNetMessageClearPayload(thecall->msg);
         if (thecall->expectReply)
             thecall->mode = VIR_NET_CLIENT_MODE_WAIT_RX;
         else
index 673fb8d00036daec3a186dd03493749654f45685..c3a2e595c130b98f4bd95afe31bdd9109690548c 100644 (file)
@@ -49,7 +49,7 @@ virNetMessagePtr virNetMessageNew(bool tracked)
 }
 
 
-static void
+void
 virNetMessageClearPayload(virNetMessagePtr msg)
 {
     size_t i;
index 89a2ebf71692110cc9fbf39e2085e4e75fabb4ff..d7406fcd24d5186c330fc9a11c75e9f38ffef024 100644 (file)
@@ -54,6 +54,8 @@ struct _virNetMessage {
 
 virNetMessagePtr virNetMessageNew(bool tracked);
 
+void virNetMessageClearPayload(virNetMessagePtr msg);
+
 void virNetMessageClear(virNetMessagePtr);
 
 void virNetMessageFree(virNetMessagePtr msg);