chiark / gitweb /
Add set_consume which always takes ownership
[elogind.git] / src / libsystemd-bus / sd-bus.c
index f40958a26e4f4891f372741343aed657a8767412..7d6d848ec579bdc766e4e3fde15a9b54855b1ef6 100644 (file)
@@ -31,6 +31,7 @@
 #include "macro.h"
 #include "strv.h"
 #include "set.h"
+#include "missing.h"
 
 #include "sd-bus.h"
 #include "bus-internal.h"
@@ -841,7 +842,7 @@ int sd_bus_open_system(sd_bus **ret) {
         if (r < 0)
                 return r;
 
-        e = getenv("DBUS_SYSTEM_BUS_ADDRESS");
+        e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
         if (e) {
                 r = sd_bus_set_address(b, e);
                 if (r < 0)
@@ -879,13 +880,13 @@ int sd_bus_open_user(sd_bus **ret) {
         if (r < 0)
                 return r;
 
-        e = getenv("DBUS_SESSION_BUS_ADDRESS");
+        e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
         if (e) {
                 r = sd_bus_set_address(b, e);
                 if (r < 0)
                         goto fail;
         } else {
-                e = getenv("XDG_RUNTIME_DIR");
+                e = secure_getenv("XDG_RUNTIME_DIR");
                 if (!e) {
                         r = -ENOENT;
                         goto fail;
@@ -1584,6 +1585,10 @@ static int process_reply(sd_bus *bus, sd_bus_message *m) {
         if (c->timeout != 0)
                 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
 
+        r = sd_bus_message_rewind(m, true);
+        if (r < 0)
+                return r;
+
         r = c->callback(bus, 0, m, c->userdata);
         free(c);
 
@@ -1611,6 +1616,10 @@ static int process_filter(sd_bus *bus, sd_bus_message *m) {
 
                         l->last_iteration = bus->iteration_counter;
 
+                        r = sd_bus_message_rewind(m, true);
+                        if (r < 0)
+                                return r;
+
                         r = l->callback(bus, 0, m, l->userdata);
                         if (r != 0)
                                 return r;
@@ -1720,6 +1729,10 @@ static int process_object(sd_bus *bus, sd_bus_message *m) {
 
                         c->last_iteration = bus->iteration_counter;
 
+                        r = sd_bus_message_rewind(m, true);
+                        if (r < 0)
+                                return r;
+
                         r = c->callback(bus, 0, m, c->userdata);
                         if (r != 0)
                                 return r;
@@ -1746,6 +1759,10 @@ static int process_object(sd_bus *bus, sd_bus_message *m) {
 
                                 c->last_iteration = bus->iteration_counter;
 
+                                r = sd_bus_message_rewind(m, true);
+                                if (r < 0)
+                                        return r;
+
                                 r = c->callback(bus, 0, m, c->userdata);
                                 if (r != 0)
                                         return r;
@@ -1824,13 +1841,9 @@ static int process_introspect(sd_bus *bus, sd_bus_message *m) {
                 if (p)
                         *p = 0;
 
-                r = set_put(s, a);
-                if (r < 0) {
-                        free(a);
-
-                        if (r != -EEXIST)
-                                return r;
-                }
+                r = set_consume(s, a);
+                if (r < 0 && r != -EEXIST)
+                        return r;
         }
 
         f = open_memstream(&introspection, &size);
@@ -1930,6 +1943,10 @@ static int process_running(sd_bus *bus, sd_bus_message **ret) {
                 goto null_message;
 
         if (ret) {
+                r = sd_bus_message_rewind(m, true);
+                if (r < 0)
+                        return r;
+
                 *ret = m;
                 m = NULL;
                 return 1;