0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-11-09 12:48:43 +00:00

OLocks in BGP must be freed early

This commit is contained in:
Maria Matejka 2023-05-07 17:30:33 +02:00
parent cb51ff1fbb
commit 69c22818fb
3 changed files with 9 additions and 1 deletions

View File

@ -1158,10 +1158,13 @@ proto_event(void *ptr)
}
if (proto_is_done(p))
{
rp_free(p->pool_fragile);
if (p->loop != &main_birdloop)
birdloop_stop_self(p->loop, proto_loop_stopped, p);
else
proto_cleanup(p);
}
}
@ -1235,7 +1238,10 @@ proto_start(struct proto *p)
p->iface_sub.target = proto_event_list(p);
PROTO_LOCKED_FROM_MAIN(p)
{
p->pool_fragile = rp_newf(p->pool, birdloop_domain(p->loop), "Protocol %s fragile objects", p->cf->name);
proto_notify_state(p, (p->proto->start ? p->proto->start(p) : PS_UP));
}
}

View File

@ -130,6 +130,8 @@ struct proto {
struct proto_config *cf; /* Configuration data */
struct proto_config *cf_new; /* Configuration we want to switch to after shutdown (NULL=delete) */
pool *pool; /* Pool containing local objects */
pool *pool_fragile; /* Pool containing fragile local objects which need to be freed
before the protocol's birdloop actually stops, like olocks */
event *event; /* Protocol event */
timer *restart_timer; /* Timer to restart the protocol from limits */
event *restart_event; /* Event to restart/shutdown the protocol from limits */

View File

@ -1742,7 +1742,7 @@ bgp_start(struct proto *P)
* so that we are the only instance attempting to talk with that neighbor.
*/
struct object_lock *lock;
lock = p->lock = olock_new(P->pool);
lock = p->lock = olock_new(P->pool_fragile);
lock->addr = p->remote_ip;
lock->port = p->cf->remote_port;
lock->iface = p->cf->iface;