[systemd-commits] 4 commits - src/core src/libsystemd

David Herrmann dvdhrm at kemper.freedesktop.org
Wed Mar 11 08:38:04 PDT 2015


 src/core/dbus.c                     |   47 ++++++++++++++++++------------------
 src/libsystemd/sd-bus/bus-message.c |    2 -
 src/libsystemd/sd-bus/sd-bus.c      |   24 +++++++++++++-----
 3 files changed, 42 insertions(+), 31 deletions(-)

New commits:
commit f5b51ea7fcb0b6380c3ceb4d4f3f22f647c6fd32
Author: David Herrmann <dh.herrmann at gmail.com>
Date:   Wed Mar 11 16:35:21 2015 +0100

    core: fix cgroups-agent match for kdbus
    
    On kdbus, we get cgroups-agent messages via the system bus, not the
    private systemd socket. Therefore, we must install the match properly or
    we will never receive cgroup notifications.

diff --git a/src/core/dbus.c b/src/core/dbus.c
index e000ccc..ae259c3 100644
--- a/src/core/dbus.c
+++ b/src/core/dbus.c
@@ -852,22 +852,19 @@ static int bus_setup_system(Manager *m, sd_bus *bus) {
         assert(m);
         assert(bus);
 
-        if (m->running_as == SYSTEMD_SYSTEM)
-                return 0;
-
-        /* If we are a user instance we get the Released message via
-         * the system bus */
-        r = sd_bus_add_match(
-                        bus,
-                        NULL,
-                        "type='signal',"
-                        "interface='org.freedesktop.systemd1.Agent',"
-                        "member='Released',"
-                        "path='/org/freedesktop/systemd1/agent'",
-                        signal_agent_released, m);
-
-        if (r < 0)
-                log_warning_errno(r, "Failed to register Released match on system bus: %m");
+        /* On kdbus or if we are a user instance we get the Released message via the system bus */
+        if (m->running_as == SYSTEMD_USER || m->kdbus_fd >= 0) {
+                r = sd_bus_add_match(
+                                bus,
+                                NULL,
+                                "type='signal',"
+                                "interface='org.freedesktop.systemd1.Agent',"
+                                "member='Released',"
+                                "path='/org/freedesktop/systemd1/agent'",
+                                signal_agent_released, m);
+                if (r < 0)
+                        log_warning_errno(r, "Failed to register Released match on system bus: %m");
+        }
 
         log_debug("Successfully connected to system bus.");
         return 0;

commit 39881ed299a39ad331262c75d9e627e6ffb848eb
Author: David Herrmann <dh.herrmann at gmail.com>
Date:   Wed Mar 11 16:32:47 2015 +0100

    core: rewind message before forwarding it
    
    Forwarding messages that are not rewinded will drop data. Fix this for
    cgroups-agent messages that we might remarshal before forwarding to the
    system bus.

diff --git a/src/core/dbus.c b/src/core/dbus.c
index 80f7589..e000ccc 100644
--- a/src/core/dbus.c
+++ b/src/core/dbus.c
@@ -88,15 +88,19 @@ static int signal_agent_released(sd_bus *bus, sd_bus_message *message, void *use
 
         manager_notify_cgroup_empty(m, cgroup);
 
-        if (m->running_as == SYSTEMD_SYSTEM && m->system_bus) {
-                /* If we are running as system manager, forward the
-                 * message to the system bus */
+        /* only forward to system bus if running as system instance */
+        if (m->running_as != SYSTEMD_SYSTEM || !m->system_bus)
+                return 0;
 
-                r = sd_bus_send(m->system_bus, message, NULL);
-                if (r < 0)
-                        log_warning_errno(r, "Failed to forward Released message: %m");
-        }
+        r = sd_bus_message_rewind(message, 1);
+        if (r < 0)
+                goto exit;
+
+        r = sd_bus_send(m->system_bus, message, NULL);
 
+exit:
+        if (r < 0)
+                log_warning_errno(r, "Failed to forward Released message: %m");
         return 0;
 }
 

commit 908b8a42e645887f1ab0616c1fc018ecc8ece91f
Author: David Herrmann <dh.herrmann at gmail.com>
Date:   Wed Mar 11 16:30:59 2015 +0100

    bus: remarshal kdbus messages received from the kernel
    
    If we receive an sd_bus_message from the kernel, m->kdbus will contain
    additional items that cannot be used when sending a message. Therefore,
    always remarshal the message if it is used again.

diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c
index 58a625f..e0b3273 100644
--- a/src/libsystemd/sd-bus/sd-bus.c
+++ b/src/libsystemd/sd-bus/sd-bus.c
@@ -1523,15 +1523,27 @@ static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
 }
 
 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
+        bool remarshal = false;
+
         assert(b);
 
-        /* Do packet version and endianness already match? */
-        if ((b->message_version == 0 || b->message_version == (*m)->header->version) &&
-            (b->message_endian == 0 || b->message_endian == (*m)->header->endian))
-                return 0;
+        /* wrong packet version */
+        if (b->message_version != 0 && b->message_version != (*m)->header->version)
+                remarshal = true;
+
+        /* wrong packet endianness */
+        if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
+                remarshal = true;
+
+        /* TODO: kdbus-messages received from the kernel contain data which is
+         * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
+         * force remarshaling of the message. Technically, we could just
+         * recreate the kdbus message, but that is non-trivial as other parts of
+         * the message refer to m->kdbus already. This should be fixed! */
+        if ((*m)->kdbus && (*m)->release_kdbus)
+                remarshal = true;
 
-        /* No? Then remarshal! */
-        return bus_message_remarshal(b, m);
+        return remarshal ? bus_message_remarshal(b, m) : 0;
 }
 
 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {

commit 8b9972db83c774ff8b9fc0bb95dc06e5658aae98
Author: David Herrmann <dh.herrmann at gmail.com>
Date:   Wed Mar 11 16:29:18 2015 +0100

    bus: drop redundant assignment
    
    This assignment is already done in the parent context, no need to do it
    again.

diff --git a/src/libsystemd/sd-bus/bus-message.c b/src/libsystemd/sd-bus/bus-message.c
index 7eac069..199b133 100644
--- a/src/libsystemd/sd-bus/bus-message.c
+++ b/src/libsystemd/sd-bus/bus-message.c
@@ -3489,8 +3489,6 @@ _public_ int sd_bus_message_read_basic(sd_bus_message *m, char type, void *p) {
                         return r;
         } else {
 
-                rindex = m->rindex;
-
                 if (IN_SET(type, SD_BUS_TYPE_STRING, SD_BUS_TYPE_OBJECT_PATH)) {
                         uint32_t l;
                         bool ok;



More information about the systemd-commits mailing list