]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Set the current client identity during API call dispatch
authorDaniel P. Berrange <berrange@redhat.com>
Mon, 23 Jan 2012 15:07:15 +0000 (15:07 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 19 Mar 2013 13:52:06 +0000 (13:52 +0000)
When dispatching an RPC API call, setup the current identity to
hold the identity of the network client associated with the
RPC message being dispatched. The setting is thread-local, so
only affects the API call in this thread

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
src/rpc/virnetserverprogram.c

index 414b9788989c0dbb1afc18f0000bc2c7f282f5ea..b80923d6c785ef299459636a76e6e7d0fdc17830 100644 (file)
@@ -375,6 +375,7 @@ virNetServerProgramDispatchCall(virNetServerProgramPtr prog,
     virNetServerProgramProcPtr dispatcher;
     virNetMessageError rerr;
     size_t i;
+    virIdentityPtr identity = NULL;
 
     memset(&rerr, 0, sizeof(rerr));
 
@@ -419,6 +420,12 @@ virNetServerProgramDispatchCall(virNetServerProgramPtr prog,
     if (virNetMessageDecodePayload(msg, dispatcher->arg_filter, arg) < 0)
         goto error;
 
+    if (!(identity = virNetServerClientGetIdentity(client)))
+        goto error;
+
+    if (virIdentitySetCurrent(identity) < 0)
+        goto error;
+
     /*
      * When the RPC handler is called:
      *
@@ -431,6 +438,9 @@ virNetServerProgramDispatchCall(virNetServerProgramPtr prog,
      */
     rv = (dispatcher->func)(server, client, msg, &rerr, arg, ret);
 
+    if (virIdentitySetCurrent(NULL) < 0)
+        goto error;
+
     /*
      * If rv == 1, this indicates the dispatch func has
      * populated 'msg' with a list of FDs to return to
@@ -481,6 +491,7 @@ virNetServerProgramDispatchCall(virNetServerProgramPtr prog,
     VIR_FREE(arg);
     VIR_FREE(ret);
 
+    virObjectUnref(identity);
     /* Put reply on end of tx queue to send out  */
     return virNetServerClientSendMessage(client, msg);
 
@@ -491,6 +502,7 @@ error:
 
     VIR_FREE(arg);
     VIR_FREE(ret);
+    virObjectUnref(identity);
 
     return rv;
 }