X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-bus.c;h=95d80db2405c8698527c28a9fb5448d95cc340ac;hp=6bd1eaa81b5ec82a75732a349608846bba1a6481;hb=c4e6e24255de376965c7f8ae53e16594c2581200;hpb=6bb648a16ae4a682ad4784412af706d2e6a3e4da diff --git a/src/libsystemd/sd-bus.c b/src/libsystemd/sd-bus.c index 6bd1eaa81..95d80db24 100644 --- a/src/libsystemd/sd-bus.c +++ b/src/libsystemd/sd-bus.c @@ -1259,12 +1259,25 @@ _public_ sd_bus *sd_bus_ref(sd_bus *bus) { } _public_ sd_bus *sd_bus_unref(sd_bus *bus) { + unsigned i; if (!bus) return NULL; - if (REFCNT_DEC(bus->n_ref) <= 0) - bus_free(bus); + i = REFCNT_DEC(bus->n_ref); + if (i != bus->rqueue_size + bus->wqueue_size) + return NULL; + + for (i = 0; i < bus->rqueue_size; i++) + if (bus->rqueue[i]->n_ref > 1) + return NULL; + + for (i = 0; i < bus->wqueue_size; i++) + if (bus->wqueue[i]->n_ref > 1) + return NULL; + + /* we are the only holders on the messages */ + bus_free(bus); return NULL; } @@ -1412,8 +1425,8 @@ static int dispatch_wqueue(sd_bus *bus) { * it got full, then all bets are off * anyway. */ - sd_bus_message_unref(bus->wqueue[0]); bus->wqueue_size --; + sd_bus_message_unref(bus->wqueue[0]); memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size); bus->windex = 0;