summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2015-07-31 16:42:38 +0200
committerDavid Herrmann <dh.herrmann@gmail.com>2015-07-31 16:42:38 +0200
commit970ad53dd63516c0fa76c772f58662902c044dcb (patch)
treedaaed2f6973d9908da3581edc03f01043009b864
parent4b6ac4326ac0b5b668c1ae2383104d5c084ef766 (diff)
downloadsystemd-970ad53dd63516c0fa76c772f58662902c044dcb.tar.gz
bus-proxy: fix cookie namespacing
If we generate messages from within bus-proxyd, we really must make sure that we do not clutter the cookie-namespace of our client. The client has full control over it, so we cannot steal cookies from it. However, we can re-use the cookie the client used for our request. As long as we only send a single message, we're fine.
-rw-r--r--src/bus-proxyd/driver.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/bus-proxyd/driver.c b/src/bus-proxyd/driver.c
index 133454ddbf..ad164a5e02 100644
--- a/src/bus-proxyd/driver.c
+++ b/src/bus-proxyd/driver.c
@@ -610,6 +610,7 @@ int bus_proxy_process_driver(Proxy *p, sd_bus *a, sd_bus *b, sd_bus_message *m,
_cleanup_bus_message_unref_ sd_bus_message *msg = NULL;
ProxyActivation *activation;
const char *name;
+ uint64_t cookie;
uint32_t flags;
if (!sd_bus_message_has_signature(m, "su"))
@@ -631,19 +632,33 @@ int bus_proxy_process_driver(Proxy *p, sd_bus *a, sd_bus *b, sd_bus_message *m,
if (p->n_activations >= PROXY_ACTIVATIONS_MAX)
return synthetic_reply_method_errno(m, -EMFILE, NULL);
+ r = sd_bus_message_get_cookie(m, &cookie);
+ if (r < 0)
+ return synthetic_reply_method_errno(m, r, NULL);
+
+ r = sd_bus_message_new_method_call(a,
+ &msg,
+ name,
+ "/",
+ "org.freedesktop.DBus.Peer",
+ "Ping");
+ if (r < 0)
+ return synthetic_reply_method_errno(m, r, NULL);
+
+ r = bus_message_seal(msg, cookie, BUS_DEFAULT_TIMEOUT);
+ if (r < 0)
+ return synthetic_reply_method_errno(m, r, NULL);
+
activation = new0(ProxyActivation, 1);
if (!activation)
return synthetic_reply_method_errno(m, -ENOMEM, NULL);
- r = sd_bus_call_method_async(a,
- &activation->slot,
- name,
- "/",
- "org.freedesktop.DBus.Peer",
- "Ping",
- driver_activation,
- activation,
- NULL);
+ r = sd_bus_call_async(a,
+ &activation->slot,
+ msg,
+ driver_activation,
+ activation,
+ 0);
if (r < 0) {
free(activation);
return synthetic_reply_method_errno(m, r, NULL);