mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-02 18:52:04 +00:00
lib: fix capability double resource allocation
Don't let `zprivs_caps_init` allocate resources without checking if there were other caps previously allocated. This fixes a memory leak that happens on daemons that `fork()` and reuse the `<daemon>_di` (see `ldpd`/`lde`/`ldpe` code). Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
This commit is contained in:
parent
f2b72ef474
commit
eb23e17fc7
39
lib/privs.c
39
lib/privs.c
@ -261,8 +261,34 @@ zebra_privs_current_t zprivs_state_caps(void)
|
||||
return ZPRIVS_LOWERED;
|
||||
}
|
||||
|
||||
/** Release private cap state if allocated. */
|
||||
static void zprivs_state_free_caps(void)
|
||||
{
|
||||
if (zprivs_state.syscaps_p) {
|
||||
if (zprivs_state.syscaps_p->num)
|
||||
XFREE(MTYPE_PRIVS, zprivs_state.syscaps_p->caps);
|
||||
|
||||
XFREE(MTYPE_PRIVS, zprivs_state.syscaps_p);
|
||||
}
|
||||
|
||||
if (zprivs_state.syscaps_i) {
|
||||
if (zprivs_state.syscaps_i->num)
|
||||
XFREE(MTYPE_PRIVS, zprivs_state.syscaps_i->caps);
|
||||
|
||||
XFREE(MTYPE_PRIVS, zprivs_state.syscaps_i);
|
||||
}
|
||||
|
||||
if (zprivs_state.caps) {
|
||||
cap_free(zprivs_state.caps);
|
||||
zprivs_state.caps = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void zprivs_caps_init(struct zebra_privs_t *zprivs)
|
||||
{
|
||||
/* Release allocated zcaps if this function was called before. */
|
||||
zprivs_state_free_caps();
|
||||
|
||||
zprivs_state.syscaps_p = zcaps2sys(zprivs->caps_p, zprivs->cap_num_p);
|
||||
zprivs_state.syscaps_i = zcaps2sys(zprivs->caps_i, zprivs->cap_num_i);
|
||||
|
||||
@ -362,18 +388,7 @@ static void zprivs_caps_terminate(void)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* free up private state */
|
||||
if (zprivs_state.syscaps_p && zprivs_state.syscaps_p->num) {
|
||||
XFREE(MTYPE_PRIVS, zprivs_state.syscaps_p->caps);
|
||||
XFREE(MTYPE_PRIVS, zprivs_state.syscaps_p);
|
||||
}
|
||||
|
||||
if (zprivs_state.syscaps_i && zprivs_state.syscaps_i->num) {
|
||||
XFREE(MTYPE_PRIVS, zprivs_state.syscaps_i->caps);
|
||||
XFREE(MTYPE_PRIVS, zprivs_state.syscaps_i);
|
||||
}
|
||||
|
||||
cap_free(zprivs_state.caps);
|
||||
zprivs_state_free_caps();
|
||||
}
|
||||
#else /* !HAVE_LCAPS */
|
||||
#error "no Linux capabilities, dazed and confused..."
|
||||
|
Loading…
Reference in New Issue
Block a user