mirror of
https://github.com/systemd/systemd.git
synced 2024-11-06 16:59:03 +03:00
bus: make sure that we always keep a ref to the bus when we dispatch callbacks
Otherwise the callback might unref the bus we are processing and destroy the object while we are processing it.
This commit is contained in:
parent
d68888227d
commit
8ce2afd634
@ -294,3 +294,9 @@ bool bus_pid_changed(sd_bus *bus);
|
||||
for (char *_slash = ({ strcpy((prefix), (path)); streq((prefix), "/") ? NULL : strrchr((prefix), '/'); }) ; \
|
||||
_slash && !(_slash[(_slash) == (prefix)] = 0); \
|
||||
_slash = streq((prefix), "/") ? NULL : strrchr((prefix), '/'))
|
||||
|
||||
/* If we are invoking callbacks of a bus object, ensure unreffing the
|
||||
* bus from the callback doesn't destroy the object we are working
|
||||
* on */
|
||||
#define BUS_DONT_DESTROY(bus) \
|
||||
_cleanup_bus_unref_ sd_bus *_dont_destroy_##bus = sd_bus_ref(bus)
|
||||
|
@ -1843,6 +1843,7 @@ int sd_bus_emit_properties_changed_strv(
|
||||
const char *interface,
|
||||
char **names) {
|
||||
|
||||
BUS_DONT_DESTROY(bus);
|
||||
char *prefix;
|
||||
int r;
|
||||
|
||||
@ -1987,6 +1988,8 @@ static int interfaces_added_append_one(
|
||||
}
|
||||
|
||||
int sd_bus_emit_interfaces_added_strv(sd_bus *bus, const char *path, char **interfaces) {
|
||||
BUS_DONT_DESTROY(bus);
|
||||
|
||||
_cleanup_bus_message_unref_ sd_bus_message *m = NULL;
|
||||
char **i;
|
||||
int r;
|
||||
|
@ -1870,6 +1870,7 @@ null_message:
|
||||
}
|
||||
|
||||
int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
|
||||
BUS_DONT_DESTROY(bus);
|
||||
int r;
|
||||
|
||||
/* Returns 0 when we didn't do anything. This should cause the
|
||||
|
Loading…
Reference in New Issue
Block a user