mirror of
https://github.com/systemd/systemd.git
synced 2024-12-26 03:22:00 +03:00
timedate: increment reference count of sd_bus_message
The commit 5d280742b6
introduces a
barrier to suppress calling context_update_ntp_status() multiple times.
However, it just stores the address of sd_bus_message object. So,
when an address is reused on the subsequent message, then the status
of NTP clients are not updated.
This makes the stored message object is referenced by the context
object. So, the subsequent message is on cirtainly different address.
This commit is contained in:
parent
f11fc3fa73
commit
2770af85ac
@ -44,6 +44,7 @@ typedef struct Context {
|
||||
char *zone;
|
||||
bool local_rtc;
|
||||
Hashmap *polkit_registry;
|
||||
sd_bus_message *cache;
|
||||
|
||||
LIST_HEAD(UnitStatusInfo, units);
|
||||
} Context;
|
||||
@ -71,6 +72,7 @@ static void context_free(Context *c) {
|
||||
|
||||
free(c->zone);
|
||||
bus_verify_polkit_async_registry_free(c->polkit_registry);
|
||||
sd_bus_message_unref(c->cache);
|
||||
|
||||
while ((p = c->units)) {
|
||||
LIST_REMOVE(units, c->units, p);
|
||||
@ -302,18 +304,20 @@ static int context_update_ntp_status(Context *c, sd_bus *bus, sd_bus_message *m)
|
||||
{ "UnitFileState", "s", NULL, offsetof(UnitStatusInfo, unit_file_state) },
|
||||
{}
|
||||
};
|
||||
static sd_bus_message *_m = NULL;
|
||||
UnitStatusInfo *u;
|
||||
int r;
|
||||
|
||||
assert(c);
|
||||
assert(bus);
|
||||
|
||||
/* Suppress multiple call of context_update_ntp_status() within single DBus transaction. */
|
||||
if (m && m == _m)
|
||||
return 0;
|
||||
/* Suppress calling context_update_ntp_status() multiple times within single DBus transaction. */
|
||||
if (m) {
|
||||
if (m == c->cache)
|
||||
return 0;
|
||||
|
||||
_m = m;
|
||||
sd_bus_message_unref(c->cache);
|
||||
c->cache = sd_bus_message_ref(m);
|
||||
}
|
||||
|
||||
LIST_FOREACH(units, u, c->units) {
|
||||
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user