|
|
36e8a3 |
From c6903d1b42d1773fda4df6676618489ad760a2a1 Mon Sep 17 00:00:00 2001
|
|
|
36e8a3 |
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
|
|
36e8a3 |
Date: Wed, 18 Jul 2018 12:16:33 +0200
|
|
|
36e8a3 |
Subject: [PATCH] bus: move BUS_DONT_DESTROY calls after asserts
|
|
|
36e8a3 |
|
|
|
36e8a3 |
It's not useful to bump the reference count before checking if the object is
|
|
|
36e8a3 |
NULL. Thanks to d40f5cc498 we can do this ;).
|
|
|
36e8a3 |
|
|
|
36e8a3 |
Related to https://bugzilla.redhat.com/show_bug.cgi?id=1576084,
|
|
|
36e8a3 |
https://bugzilla.redhat.com/show_bug.cgi?id=1575340,
|
|
|
36e8a3 |
https://bugzilla.redhat.com/show_bug.cgi?id=1575350. I'm not sure why those two
|
|
|
36e8a3 |
people hit this code path, while most people don't. At least we won't abort.
|
|
|
36e8a3 |
|
|
|
36e8a3 |
(cherry picked from commit 7ae8edcd03f74da123298330b76c3fc5425042ef)
|
|
|
36e8a3 |
|
|
|
36e8a3 |
Resolves: #1610397
|
|
|
36e8a3 |
---
|
|
|
36e8a3 |
src/libsystemd/sd-bus/bus-objects.c | 15 ++++++++-------
|
|
|
36e8a3 |
src/libsystemd/sd-bus/sd-bus.c | 3 ++-
|
|
|
36e8a3 |
2 files changed, 10 insertions(+), 8 deletions(-)
|
|
|
36e8a3 |
|
|
|
36e8a3 |
diff --git a/src/libsystemd/sd-bus/bus-objects.c b/src/libsystemd/sd-bus/bus-objects.c
|
|
|
4bff0a |
index 9609834fa9..a18ff88b07 100644
|
|
|
36e8a3 |
--- a/src/libsystemd/sd-bus/bus-objects.c
|
|
|
36e8a3 |
+++ b/src/libsystemd/sd-bus/bus-objects.c
|
|
|
36e8a3 |
@@ -2090,7 +2090,6 @@ _public_ int sd_bus_emit_properties_changed_strv(
|
|
|
36e8a3 |
const char *interface,
|
|
|
36e8a3 |
char **names) {
|
|
|
36e8a3 |
|
|
|
36e8a3 |
- BUS_DONT_DESTROY(bus);
|
|
|
36e8a3 |
bool found_interface = false;
|
|
|
36e8a3 |
char *prefix;
|
|
|
36e8a3 |
int r;
|
|
|
36e8a3 |
@@ -2111,6 +2110,8 @@ _public_ int sd_bus_emit_properties_changed_strv(
|
|
|
36e8a3 |
if (names && names[0] == NULL)
|
|
|
36e8a3 |
return 0;
|
|
|
36e8a3 |
|
|
|
36e8a3 |
+ BUS_DONT_DESTROY(bus);
|
|
|
36e8a3 |
+
|
|
|
36e8a3 |
do {
|
|
|
36e8a3 |
bus->nodes_modified = false;
|
|
|
36e8a3 |
|
|
|
36e8a3 |
@@ -2310,8 +2311,6 @@ static int object_added_append_all(sd_bus *bus, sd_bus_message *m, const char *p
|
|
|
36e8a3 |
}
|
|
|
36e8a3 |
|
|
|
36e8a3 |
_public_ int sd_bus_emit_object_added(sd_bus *bus, const char *path) {
|
|
|
36e8a3 |
- BUS_DONT_DESTROY(bus);
|
|
|
36e8a3 |
-
|
|
|
36e8a3 |
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
|
|
|
36e8a3 |
struct node *object_manager;
|
|
|
36e8a3 |
int r;
|
|
|
36e8a3 |
@@ -2341,6 +2340,8 @@ _public_ int sd_bus_emit_object_added(sd_bus *bus, const char *path) {
|
|
|
36e8a3 |
if (r == 0)
|
|
|
36e8a3 |
return -ESRCH;
|
|
|
36e8a3 |
|
|
|
36e8a3 |
+ BUS_DONT_DESTROY(bus);
|
|
|
36e8a3 |
+
|
|
|
36e8a3 |
do {
|
|
|
36e8a3 |
bus->nodes_modified = false;
|
|
|
36e8a3 |
m = sd_bus_message_unref(m);
|
|
|
36e8a3 |
@@ -2481,8 +2482,6 @@ static int object_removed_append_all(sd_bus *bus, sd_bus_message *m, const char
|
|
|
36e8a3 |
}
|
|
|
36e8a3 |
|
|
|
36e8a3 |
_public_ int sd_bus_emit_object_removed(sd_bus *bus, const char *path) {
|
|
|
36e8a3 |
- BUS_DONT_DESTROY(bus);
|
|
|
36e8a3 |
-
|
|
|
36e8a3 |
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
|
|
|
36e8a3 |
struct node *object_manager;
|
|
|
36e8a3 |
int r;
|
|
|
36e8a3 |
@@ -2512,6 +2511,8 @@ _public_ int sd_bus_emit_object_removed(sd_bus *bus, const char *path) {
|
|
|
36e8a3 |
if (r == 0)
|
|
|
36e8a3 |
return -ESRCH;
|
|
|
36e8a3 |
|
|
|
36e8a3 |
+ BUS_DONT_DESTROY(bus);
|
|
|
36e8a3 |
+
|
|
|
36e8a3 |
do {
|
|
|
36e8a3 |
bus->nodes_modified = false;
|
|
|
36e8a3 |
m = sd_bus_message_unref(m);
|
|
|
36e8a3 |
@@ -2645,8 +2646,6 @@ static int interfaces_added_append_one(
|
|
|
36e8a3 |
}
|
|
|
36e8a3 |
|
|
|
36e8a3 |
_public_ int sd_bus_emit_interfaces_added_strv(sd_bus *bus, const char *path, char **interfaces) {
|
|
|
36e8a3 |
- BUS_DONT_DESTROY(bus);
|
|
|
36e8a3 |
-
|
|
|
36e8a3 |
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
|
|
|
36e8a3 |
struct node *object_manager;
|
|
|
36e8a3 |
char **i;
|
|
|
36e8a3 |
@@ -2669,6 +2668,8 @@ _public_ int sd_bus_emit_interfaces_added_strv(sd_bus *bus, const char *path, ch
|
|
|
36e8a3 |
if (r == 0)
|
|
|
36e8a3 |
return -ESRCH;
|
|
|
36e8a3 |
|
|
|
36e8a3 |
+ BUS_DONT_DESTROY(bus);
|
|
|
36e8a3 |
+
|
|
|
36e8a3 |
do {
|
|
|
36e8a3 |
bus->nodes_modified = false;
|
|
|
36e8a3 |
m = sd_bus_message_unref(m);
|
|
|
36e8a3 |
diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c
|
|
|
4bff0a |
index 089b51a6d9..7f03528b89 100644
|
|
|
36e8a3 |
--- a/src/libsystemd/sd-bus/sd-bus.c
|
|
|
36e8a3 |
+++ b/src/libsystemd/sd-bus/sd-bus.c
|
|
|
36e8a3 |
@@ -2883,7 +2883,6 @@ finish:
|
|
|
36e8a3 |
}
|
|
|
36e8a3 |
|
|
|
36e8a3 |
static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
|
|
|
36e8a3 |
- BUS_DONT_DESTROY(bus);
|
|
|
36e8a3 |
int r;
|
|
|
36e8a3 |
|
|
|
36e8a3 |
/* Returns 0 when we didn't do anything. This should cause the
|
|
|
36e8a3 |
@@ -2899,6 +2898,8 @@ static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priorit
|
|
|
36e8a3 |
assert_return(!bus->current_message, -EBUSY);
|
|
|
36e8a3 |
assert(!bus->current_slot);
|
|
|
36e8a3 |
|
|
|
36e8a3 |
+ BUS_DONT_DESTROY(bus);
|
|
|
36e8a3 |
+
|
|
|
36e8a3 |
switch (bus->state) {
|
|
|
36e8a3 |
|
|
|
36e8a3 |
case BUS_UNSET:
|