X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=src%2Flibsystemd-bus%2Fsd-bus.c;h=4a081778ace4f9872735b337077b984084e678ad;hb=e4ee6e5cc3e8e23e1ecc0d9fa756d9cc2534d218;hp=29487cbd317904f545b27b570c7ea5712695b55c;hpb=6629161f827c82889cf45cfcdce62dcb543eda23;p=elogind.git diff --git a/src/libsystemd-bus/sd-bus.c b/src/libsystemd-bus/sd-bus.c index 29487cbd3..4a081778a 100644 --- a/src/libsystemd-bus/sd-bus.c +++ b/src/libsystemd-bus/sd-bus.c @@ -31,6 +31,7 @@ #include "macro.h" #include "strv.h" #include "set.h" +#include "missing.h" #include "sd-bus.h" #include "bus-internal.h" @@ -55,6 +56,7 @@ static void bus_free(sd_bus *b) { free(b->unique_name); free(b->auth_buffer); free(b->address); + free(b->kernel); free(b->exec_path); strv_free(b->exec_argv); @@ -84,9 +86,10 @@ static void bus_free(sd_bus *b) { } hashmap_free(b->object_callbacks); - bus_match_free(&b->match_callbacks); + bus_kernel_flush_memfd(b); + free(b); } @@ -100,7 +103,7 @@ int sd_bus_new(sd_bus **ret) { if (!r) return -ENOMEM; - r->n_ref = 1; + r->n_ref = REFCNT_INIT; r->input_fd = r->output_fd = -1; r->message_version = 1; r->negotiate_fds = true; @@ -226,18 +229,18 @@ int sd_bus_set_anonymous(sd_bus *bus, int b) { return 0; } -static int hello_callback(sd_bus *bus, int error, sd_bus_message *reply, void *userdata) { +static int hello_callback(sd_bus *bus, sd_bus_message *reply, void *userdata) { const char *s; int r; assert(bus); assert(bus->state == BUS_HELLO); - - if (error != 0) - return -error; - assert(reply); + r = bus_message_to_errno(reply); + if (r < 0) + return r; + r = sd_bus_message_read(reply, "s", &s); if (r < 0) return r; @@ -279,7 +282,7 @@ static int bus_send_hello(sd_bus *bus) { int bus_start_running(sd_bus *bus) { assert(bus); - if (bus->bus_client) { + if (bus->bus_client && !bus->is_kernel) { bus->state = BUS_HELLO; return 1; } @@ -840,7 +843,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) @@ -878,13 +881,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; @@ -931,9 +934,8 @@ sd_bus *sd_bus_ref(sd_bus *bus) { if (!bus) return NULL; - assert(bus->n_ref > 0); + assert_se(REFCNT_INC(bus->n_ref) >= 2); - bus->n_ref++; return bus; } @@ -941,10 +943,7 @@ sd_bus *sd_bus_unref(sd_bus *bus) { if (!bus) return NULL; - assert(bus->n_ref > 0); - bus->n_ref--; - - if (bus->n_ref <= 0) + if (REFCNT_DEC(bus->n_ref) <= 0) bus_free(bus); return NULL; @@ -1520,6 +1519,7 @@ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) { } static int process_timeout(sd_bus *bus) { + _cleanup_bus_message_unref_ sd_bus_message* m = NULL; struct reply_callback *c; usec_t n; int r; @@ -1534,10 +1534,18 @@ static int process_timeout(sd_bus *bus) { if (c->timeout > n) return 0; + r = bus_message_new_synthetic_error( + bus, + c->serial, + &SD_BUS_ERROR_MAKE("org.freedesktop.DBus.Error.Timeout", "Timed out"), + &m); + if (r < 0) + return r; + assert_se(prioq_pop(bus->reply_callbacks_prioq) == c); hashmap_remove(bus->reply_callbacks, &c->serial); - r = c->callback(bus, ETIMEDOUT, NULL, c->userdata); + r = c->callback(bus, m, c->userdata); free(c); return r < 0 ? r : 1; @@ -1583,7 +1591,11 @@ 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 = c->callback(bus, 0, m, c->userdata); + r = sd_bus_message_rewind(m, true); + if (r < 0) + return r; + + r = c->callback(bus, m, c->userdata); free(c); return r; @@ -1610,7 +1622,11 @@ static int process_filter(sd_bus *bus, sd_bus_message *m) { l->last_iteration = bus->iteration_counter; - r = l->callback(bus, 0, m, l->userdata); + r = sd_bus_message_rewind(m, true); + if (r < 0) + return r; + + r = l->callback(bus, m, l->userdata); if (r != 0) return r; @@ -1630,7 +1646,7 @@ static int process_match(sd_bus *bus, sd_bus_message *m) { do { bus->match_callbacks_modified = false; - r = bus_match_run(bus, &bus->match_callbacks, 0, m); + r = bus_match_run(bus, &bus->match_callbacks, m); if (r != 0) return r; @@ -1719,7 +1735,11 @@ static int process_object(sd_bus *bus, sd_bus_message *m) { c->last_iteration = bus->iteration_counter; - r = c->callback(bus, 0, m, c->userdata); + r = sd_bus_message_rewind(m, true); + if (r < 0) + return r; + + r = c->callback(bus, m, c->userdata); if (r != 0) return r; @@ -1745,7 +1765,11 @@ static int process_object(sd_bus *bus, sd_bus_message *m) { c->last_iteration = bus->iteration_counter; - r = c->callback(bus, 0, m, c->userdata); + r = sd_bus_message_rewind(m, true); + if (r < 0) + return r; + + r = c->callback(bus, m, c->userdata); if (r != 0) return r; @@ -1823,13 +1847,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); @@ -1929,6 +1949,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;