]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Fix ObjectManager interface emitted for non-manager objects 23702/head
authorigo95862 <igo95862@yandex.ru>
Sun, 3 Jul 2022 16:24:15 +0000 (19:24 +0300)
committerigo95862 <igo95862@yandex.ru>
Mon, 25 Jul 2022 20:54:54 +0000 (23:54 +0300)
src/libsystemd/sd-bus/bus-objects.c

index 4509dd66f47c9db10db96e352bd0bb4ec8b6afa0..2ad7a9993d949ee09ca9bbc48482e7b2db3eacaf 100644 (file)
@@ -1557,13 +1557,18 @@ void bus_node_gc(sd_bus *b, struct node *n) {
         free(n);
 }
 
-static int bus_find_parent_object_manager(sd_bus *bus, struct node **out, const char *path) {
+static int bus_find_parent_object_manager(sd_bus *bus, struct node **out, const char *path, bool* path_has_object_manager) {
         struct node *n;
 
         assert(bus);
         assert(path);
+        assert(path_has_object_manager);
 
         n = hashmap_get(bus->nodes, path);
+
+        if (n)
+                *path_has_object_manager = n->object_managers;
+
         if (!n) {
                 _cleanup_free_ char *prefix = NULL;
                 size_t pl;
@@ -2432,7 +2437,7 @@ static int object_added_append_all_prefix(
         return 0;
 }
 
-static int object_added_append_all(sd_bus *bus, sd_bus_message *m, const char *path) {
+static int object_added_append_all(sd_bus *bus, sd_bus_message *m, const char *path, bool path_has_object_manager) {
         _cleanup_ordered_set_free_ OrderedSet *s = NULL;
         _cleanup_free_ char *prefix = NULL;
         size_t pl;
@@ -2470,9 +2475,11 @@ static int object_added_append_all(sd_bus *bus, sd_bus_message *m, const char *p
         r = sd_bus_message_append(m, "{sa{sv}}", "org.freedesktop.DBus.Properties", 0);
         if (r < 0)
                 return r;
-        r = sd_bus_message_append(m, "{sa{sv}}", "org.freedesktop.DBus.ObjectManager", 0);
-        if (r < 0)
-                return r;
+        if (path_has_object_manager){
+                r = sd_bus_message_append(m, "{sa{sv}}", "org.freedesktop.DBus.ObjectManager", 0);
+                if (r < 0)
+                        return r;
+        }
 
         r = object_added_append_all_prefix(bus, m, s, path, path, false);
         if (r < 0)
@@ -2521,7 +2528,8 @@ _public_ int sd_bus_emit_object_added(sd_bus *bus, const char *path) {
         if (!BUS_IS_OPEN(bus->state))
                 return -ENOTCONN;
 
-        r = bus_find_parent_object_manager(bus, &object_manager, path);
+        bool path_has_object_manager = false;
+        r = bus_find_parent_object_manager(bus, &object_manager, path, &path_has_object_manager);
         if (r < 0)
                 return r;
         if (r == 0)
@@ -2545,7 +2553,7 @@ _public_ int sd_bus_emit_object_added(sd_bus *bus, const char *path) {
                 if (r < 0)
                         return r;
 
-                r = object_added_append_all(bus, m, path);
+                r = object_added_append_all(bus, m, path, path_has_object_manager);
                 if (r < 0)
                         return r;
 
@@ -2621,7 +2629,7 @@ static int object_removed_append_all_prefix(
         return 0;
 }
 
-static int object_removed_append_all(sd_bus *bus, sd_bus_message *m, const char *path) {
+static int object_removed_append_all(sd_bus *bus, sd_bus_message *m, const char *path, bool path_has_object_manager) {
         _cleanup_ordered_set_free_ OrderedSet *s = NULL;
         _cleanup_free_ char *prefix = NULL;
         size_t pl;
@@ -2646,9 +2654,12 @@ static int object_removed_append_all(sd_bus *bus, sd_bus_message *m, const char
         r = sd_bus_message_append(m, "s", "org.freedesktop.DBus.Properties");
         if (r < 0)
                 return r;
-        r = sd_bus_message_append(m, "s", "org.freedesktop.DBus.ObjectManager");
-        if (r < 0)
-                return r;
+
+        if (path_has_object_manager){
+                r = sd_bus_message_append(m, "s", "org.freedesktop.DBus.ObjectManager");
+                if (r < 0)
+                        return r;
+        }
 
         r = object_removed_append_all_prefix(bus, m, s, path, path, false);
         if (r < 0)
@@ -2697,7 +2708,8 @@ _public_ int sd_bus_emit_object_removed(sd_bus *bus, const char *path) {
         if (!BUS_IS_OPEN(bus->state))
                 return -ENOTCONN;
 
-        r = bus_find_parent_object_manager(bus, &object_manager, path);
+        bool path_has_object_manager = false;
+        r = bus_find_parent_object_manager(bus, &object_manager, path, &path_has_object_manager);
         if (r < 0)
                 return r;
         if (r == 0)
@@ -2721,7 +2733,7 @@ _public_ int sd_bus_emit_object_removed(sd_bus *bus, const char *path) {
                 if (r < 0)
                         return r;
 
-                r = object_removed_append_all(bus, m, path);
+                r = object_removed_append_all(bus, m, path, path_has_object_manager);
                 if (r < 0)
                         return r;
 
@@ -2858,7 +2870,8 @@ _public_ int sd_bus_emit_interfaces_added_strv(sd_bus *bus, const char *path, ch
         if (strv_isempty(interfaces))
                 return 0;
 
-        r = bus_find_parent_object_manager(bus, &object_manager, path);
+        bool path_has_object_manager = false;
+        r = bus_find_parent_object_manager(bus, &object_manager, path, &path_has_object_manager);
         if (r < 0)
                 return r;
         if (r == 0)
@@ -2945,7 +2958,8 @@ _public_ int sd_bus_emit_interfaces_removed_strv(sd_bus *bus, const char *path,
         if (strv_isempty(interfaces))
                 return 0;
 
-        r = bus_find_parent_object_manager(bus, &object_manager, path);
+        bool path_has_object_manager = false;
+        r = bus_find_parent_object_manager(bus, &object_manager, path, &path_has_object_manager);
         if (r < 0)
                 return r;
         if (r == 0)