mirror of
https://github.com/systemd/systemd.git
synced 2025-03-19 22:50:17 +03:00
sd-bus: switch to a manual overflow check in sd_bus_track_add_name()
This is generally used in a directly client controllable way, hence we should handle ref count overflow gracefully, instead of hitting an assert(). As discussed: https://github.com/systemd/systemd/pull/23099#discussion_r854341850
This commit is contained in:
parent
7d3e856e82
commit
7f40cb7c86
@ -48,7 +48,7 @@ static struct track_item* track_item_free(struct track_item *i) {
|
||||
return mfree(i);
|
||||
}
|
||||
|
||||
DEFINE_PRIVATE_TRIVIAL_REF_UNREF_FUNC(struct track_item, track_item, track_item_free);
|
||||
DEFINE_PRIVATE_TRIVIAL_UNREF_FUNC(struct track_item, track_item, track_item_free);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(struct track_item*, track_item_unref);
|
||||
DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(track_item_hash_ops, char, string_hash_func, string_compare_func,
|
||||
struct track_item, track_item_free);
|
||||
@ -190,8 +190,18 @@ _public_ int sd_bus_track_add_name(sd_bus_track *track, const char *name) {
|
||||
|
||||
i = hashmap_get(track->names, name);
|
||||
if (i) {
|
||||
if (track->recursive)
|
||||
track_item_ref(i);
|
||||
if (track->recursive) {
|
||||
assert(i->n_ref > 0);
|
||||
|
||||
/* Manual oveflow check (instead of a DEFINE_TRIVIAL_REF_FUNC() helper or so), so
|
||||
* that we can return a proper error, given this is almost always called in a
|
||||
* directly client controllable way, and thus better should never hit an assertion
|
||||
* here. */
|
||||
if (i->n_ref >= UINT_MAX)
|
||||
return -EOVERFLOW;
|
||||
|
||||
i->n_ref++;
|
||||
}
|
||||
|
||||
bus_track_remove_from_queue(track);
|
||||
return 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user