chiark / gitweb /
sd-bus: include queried path in GetManagedObjects
authorDavid Herrmann <dh.herrmann@gmail.com>
Thu, 9 Jul 2015 11:27:57 +0000 (13:27 +0200)
committerSven Eden <yamakuzure@gmx.net>
Tue, 14 Mar 2017 09:06:01 +0000 (10:06 +0100)
If GetManagedObjects is called on /foo/bar, then it should also include
the object /foo/bar, if it exists. Right now, we only include objects
underneath /foo/bar/.

This follows the behavior of existing dbus implementations.

Obsoletes #527 and fixes #525. Reported by: Nathaniel McCallum

src/libelogind/sd-bus/bus-objects.c
src/libelogind/sd-bus/test-bus-objects.c

index 2eaa7de30628945b871d4383429a3081ee8fd1d2..b3cc28ee9bc57ee05db3a6d4b4a0565a55541842 100644 (file)
@@ -1164,6 +1164,10 @@ static int process_get_managed_objects(
         if (bus->nodes_modified)
                 return 0;
 
         if (bus->nodes_modified)
                 return 0;
 
+        r = set_put_strdup(s, m->path);
+        if (r < 0)
+                return r;
+
         r = sd_bus_message_new_method_return(m, &reply);
         if (r < 0)
                 return r;
         r = sd_bus_message_new_method_return(m, &reply);
         if (r < 0)
                 return r;
index 52952603e455fd51652bd235b1b98c2a1c55a8d6..1db67ecfac703420b2ec6a650edfd6e5e3ad05e6 100644 (file)
@@ -115,14 +115,13 @@ static int set_handler(sd_bus *bus, const char *path, const char *interface, con
 
 static int value_handler(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
         _cleanup_free_ char *s = NULL;
 
 static int value_handler(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
         _cleanup_free_ char *s = NULL;
-        const char *x;
         int r;
 
         assert_se(asprintf(&s, "object %p, path %s", userdata, path) >= 0);
         r = sd_bus_message_append(reply, "s", s);
         assert_se(r >= 0);
 
         int r;
 
         assert_se(asprintf(&s, "object %p, path %s", userdata, path) >= 0);
         r = sd_bus_message_append(reply, "s", s);
         assert_se(r >= 0);
 
-        assert_se(x = startswith(path, "/value/"));
+        assert_se(startswith(path, "/value/") != NULL || strcmp(path, "/value") == 0);
 
         assert_se(PTR_TO_UINT(userdata) == 30);
 
 
         assert_se(PTR_TO_UINT(userdata) == 30);