kdbus: make sure all used data structures are initialized
authorMaciej Slodczyk <m.slodczyk2@partner.samsung.com>
Tue, 25 Feb 2020 17:50:15 +0000 (18:50 +0100)
committerAdrian Szyndela <adrian.s@samsung.com>
Wed, 4 Mar 2020 09:40:38 +0000 (10:40 +0100)
Signed-off-by: Maciej Slodczyk <m.slodczyk2@partner.samsung.com>
src/libsystemd/sd-bus/bus-control-kernel.c

index aeb8356..d539efa 100644 (file)
@@ -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;