From: Lennart Poettering Date: Wed, 30 May 2018 14:35:36 +0000 (+0200) Subject: sd-bus: make add match method callback slot "floating" X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=f0580b86936fbf46f0dd5cb2a91ad9ceff033a35;p=elogind.git sd-bus: make add match method callback slot "floating" When we allocate an asynchronous match object we will allocate an asynchronous bus call object to install the match server side. Previously the call slot would be created as regular slot, i.e. non-floating which meant installing the match even if it was itself floating would result in a non-floating slot to be created internally, which ultimately would mean the sd_bus object would be referenced by it, and thus never be freed. Let's fix that by making the match method callback floating in any case as we have no interest in leaving the bus allocated beyond the match slot. Fixes: #8551 --- diff --git a/src/libelogind/sd-bus/sd-bus.c b/src/libelogind/sd-bus/sd-bus.c index 2b72b6b56..220fcdcf5 100644 --- a/src/libelogind/sd-bus/sd-bus.c +++ b/src/libelogind/sd-bus/sd-bus.c @@ -3240,13 +3240,21 @@ static int bus_add_match_full( goto finish; } - if (asynchronous) + if (asynchronous) { r = bus_add_match_internal_async(bus, &s->match_callback.install_slot, s->match_callback.match_string, add_match_callback, s); - else + + if (r < 0) + return r; + + /* Make the slot of the match call floating now. We need the reference, but we don't + * want that this match pins the bus object, hence we first create it non-floating, but + * then make it floating. */ + r = sd_bus_slot_set_floating(s->match_callback.install_slot, true); + } else r = bus_add_match_internal(bus, s->match_callback.match_string); if (r < 0) goto finish;