From ac471acbd1bc1fd51cd2dbcb38bdf853357bee43 Mon Sep 17 00:00:00 2001 From: Maciej Slodczyk Date: Tue, 25 Feb 2020 18:50:15 +0100 Subject: [PATCH] kdbus: make sure all used data structures are initialized Signed-off-by: Maciej Slodczyk --- src/libsystemd/sd-bus/bus-control-kernel.c | 37 ++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/libsystemd/sd-bus/bus-control-kernel.c b/src/libsystemd/sd-bus/bus-control-kernel.c index aeb8356..d539efa 100644 --- a/src/libsystemd/sd-bus/bus-control-kernel.c +++ b/src/libsystemd/sd-bus/bus-control-kernel.c @@ -73,6 +73,7 @@ int bus_request_name_kernel(sd_bus *bus, const char *name, uint64_t flags) { return 1; } +//TODO: copied static func from sd-bus.c - make it shared static usec_t calc_elapse(sd_bus *bus, uint64_t usec) { assert(bus); @@ -89,6 +90,26 @@ static usec_t calc_elapse(sd_bus *bus, uint64_t usec) { return now(CLOCK_MONOTONIC) + usec; } +//TODO: copied static func from sd-bus.c - make it shared +static int timeout_compare(const void *a, const void *b) { + const struct reply_callback *x = a, *y = b; + + if (x->timeout_usec != 0 && y->timeout_usec == 0) + return -1; + + if (x->timeout_usec == 0 && y->timeout_usec != 0) + return 1; + + if (x->timeout_usec < y->timeout_usec) + return -1; + + if (x->timeout_usec > y->timeout_usec) + return 1; + + return 0; +} + + int bus_request_name_kernel_async(sd_bus *bus, sd_bus_slot **ret_slot, const char *name, @@ -105,6 +126,14 @@ int bus_request_name_kernel_async(sd_bus *bus, if (ret < 0) return ret; + ret = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops); + if (ret < 0) + return ret; + + ret = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare); + if (ret < 0) + return ret; + ret = bus_request_name_kernel(bus, name, flags); if (ret < 0) { @@ -201,6 +230,14 @@ int bus_release_name_kernel_async( if (ret < 0) return ret; + ret = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops); + if (ret < 0) + return ret; + + ret = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare); + if (ret < 0) + return ret; + ret = bus_release_name_kernel(bus, name); cookie = ++bus->cookie; -- 2.7.4