[Tested in latest gnome-ostree; if accepted, I'll look at a followup
 patch which fixes the other dbus_connection_send(reply, ...) calls
 besides logind]

DBus messages can have a flag NO_REPLY associated that means "I don't
need a reply".  This is for efficiency reasons - for one-off requests
that can't return an error, etc.

However, it's up to users to manually check
dbus_message_get_no_reply() from a message.  libdbus will happily send
out a reply if you don't.

Unfortunately, doing so is not just less efficient - it also triggers
a security error, for complex reasons.  This is something that will
eventually be fixed in dbus, but it's also correct to handle it in
client applications.

This new helper API is slightly nicer in that you don't have to pass
NULL to say you don't want a reply serial for your reply.

This patch also tweaks logind to use the API - there are more areas of
the code that need this treatment too.
---
 src/login/logind-dbus.c  |  4 ++--
 src/shared/dbus-common.c | 13 +++++++++++--
 src/shared/dbus-common.h |  4 ++++
 3 files changed, 17 insertions(+), 4 deletions(-)


>From ad18c84325345ea6ed235b02b66c6920268f7b8c Mon Sep 17 00:00:00 2001
From: Colin Walters <walt...@verbum.org>
Date: Tue, 30 Oct 2012 15:15:40 -0400
Subject: [PATCH] dbus-common: Add helper method to handle no-reply messages

DBus messages can have a flag NO_REPLY associated that means "I don't
need a reply".  This is for efficiency reasons - for one-off requests
that can't return an error, etc.

However, it's up to users to manually check
dbus_message_get_no_reply() from a message.  libdbus will happily send
out a reply if you don't.

Unfortunately, doing so is not just less efficient - it also triggers
a security error, for complex reasons.  This is something that will
eventually be fixed in dbus, but it's also correct to handle it in
client applications.

This new helper API is slightly nicer in that you don't have to pass
NULL to say you don't want a reply serial for your reply.

This patch also tweaks logind to use the API - there are more areas of
the code that need this treatment too.
---
 src/login/logind-dbus.c  |  4 ++--
 src/shared/dbus-common.c | 13 +++++++++++--
 src/shared/dbus-common.h |  4 ++++
 3 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index 8b6021d..89021ab 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -2276,8 +2276,8 @@ static DBusHandlerResult manager_message_handler(
         }
 
         if (reply) {
-                if (!dbus_connection_send(connection, reply, NULL))
-                        goto oom;
+                if (!bus_maybe_send_reply(connection, message, reply))
+                                goto oom;
 
                 dbus_message_unref(reply);
         }
diff --git a/src/shared/dbus-common.c b/src/shared/dbus-common.c
index ee281e5..e9a78c2 100644
--- a/src/shared/dbus-common.c
+++ b/src/shared/dbus-common.c
@@ -501,7 +501,7 @@ set_prop:
         }
 
         if (reply) {
-                if (!dbus_connection_send(c, reply, NULL))
+                if (!bus_maybe_send_reply(c, message, reply))
                         goto oom;
 
                 return DBUS_HANDLER_RESULT_HANDLED;
@@ -713,6 +713,15 @@ const char *bus_errno_to_dbus(int error) {
         return DBUS_ERROR_FAILED;
 }
 
+dbus_bool_t bus_maybe_send_reply (DBusConnection   *c,
+                                  DBusMessage *message,
+                                  DBusMessage *reply)
+{
+        if (dbus_message_get_no_reply (message))
+                return TRUE;
+        return dbus_connection_send (c, reply, NULL);
+}
+
 DBusHandlerResult bus_send_error_reply(DBusConnection *c, DBusMessage *message, DBusError *berror, int error) {
         _cleanup_dbus_message_unref_ DBusMessage *reply = NULL;
         const char *name, *text;
@@ -729,7 +738,7 @@ DBusHandlerResult bus_send_error_reply(DBusConnection *c, DBusMessage *message,
         if (!reply)
                 goto oom;
 
-        if (!dbus_connection_send(c, reply, NULL))
+        if (!bus_maybe_send_reply(c, message, reply))
                 goto oom;
 
         if (berror)
diff --git a/src/shared/dbus-common.h b/src/shared/dbus-common.h
index 005a715..3b7ae16 100644
--- a/src/shared/dbus-common.h
+++ b/src/shared/dbus-common.h
@@ -113,6 +113,10 @@ typedef struct BusBoundProperties {
         const void *const base;          /* base pointer to which the offset must be added to reach data */
 } BusBoundProperties;
 
+dbus_bool_t bus_maybe_send_reply (DBusConnection   *c,
+                                  DBusMessage *message,
+                                  DBusMessage *reply);
+
 DBusHandlerResult bus_send_error_reply(
                 DBusConnection *c,
                 DBusMessage *message,
-- 
1.7.11.7

_______________________________________________
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to