Skip to content

Commit

Permalink
util/user: keep reference to user in each usage table
Browse files Browse the repository at this point in the history
Keep a reference to an owning user in each usage table. We want to allow
callers to hold charges without holding on to any user references.

Also fix the peer-deinitialization to be ordered correctly and free the
user references last (in particular, after the charges). This is not
strictly necessary, but now follows our coding style and would have
avoided possible failures.

This fixes an assertion failure when disconnecting entire groups of
peers of the same user, due to the recent fix that actually made
peer-accounting do something.

Reported-by: Torge Matthies
Reported-by: Mel34
Signed-off-by: David Rheinsberg <david.rheinsberg@gmail.com>
  • Loading branch information
dvdhrm committed May 11, 2022
1 parent cf3b49c commit 608b259
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/bus/peer.c
Expand Up @@ -358,12 +358,12 @@ Peer *peer_free(Peer *peer) {
name_owner_deinit(&peer->owned_names);
policy_snapshot_free(peer->policy);
connection_deinit(&peer->connection);
user_unref(peer->user);
user_charge_deinit(&peer->charges[2]);
user_charge_deinit(&peer->charges[1]);
user_charge_deinit(&peer->charges[0]);
free(peer->seclabel);
free(peer->gids);
user_unref(peer->user);
free(peer);

close(fd);
Expand Down
3 changes: 2 additions & 1 deletion src/util/user.c
Expand Up @@ -48,7 +48,7 @@ static int user_usage_new(UserUsage **usagep, User *user, uid_t uid) {
return error_origin(-ENOMEM);

usage->n_refs = REF_INIT;
usage->user = user;
usage->user = user_ref(user);
usage->uid = uid;
usage->user_node = (CRBNode)C_RBNODE_INIT(usage->user_node);

Expand All @@ -64,6 +64,7 @@ static void user_usage_free(_Atomic unsigned long *n_refs, void *userdata) {
c_assert(!usage->slots[i]);

user_usage_unlink(usage);
user_unref(usage->user);
free(usage);
}

Expand Down

0 comments on commit 608b259

Please sign in to comment.