From: Martin Willi Date: Wed, 29 Jun 2011 10:08:24 +0000 (+0200) Subject: Clear traps during shutdown before unloading kernel plugins X-Git-Tag: 4.6.0~351 X-Git-Url: https://git.strongswan.org/?p=strongswan.git;a=commitdiff_plain;h=f8437dd8d2582d75aeec7933107bad9839fead74 Clear traps during shutdown before unloading kernel plugins --- diff --git a/src/libcharon/daemon.c b/src/libcharon/daemon.c index 12c6b2a..f21a795 100644 --- a/src/libcharon/daemon.c +++ b/src/libcharon/daemon.c @@ -106,6 +106,10 @@ static void destroy(private_daemon_t *this) { this->public.ike_sa_manager->flush(this->public.ike_sa_manager); } + if (this->public.traps) + { + this->public.traps->flush(this->public.traps); + } DESTROY_IF(this->public.receiver); DESTROY_IF(this->public.sender); /* unload plugins to release threads */ diff --git a/src/libcharon/sa/trap_manager.c b/src/libcharon/sa/trap_manager.c index bb5c3f0..bf9f843 100644 --- a/src/libcharon/sa/trap_manager.c +++ b/src/libcharon/sa/trap_manager.c @@ -350,6 +350,12 @@ METHOD(listener_t, child_state_change, bool, } } +METHOD(trap_manager_t, flush, void, + private_trap_manager_t *this) +{ + this->traps->invoke_function(this->traps, (void*)destroy_entry); +} + METHOD(trap_manager_t, destroy, void, private_trap_manager_t *this) { @@ -373,6 +379,7 @@ trap_manager_t *trap_manager_create(void) .uninstall = _uninstall, .create_enumerator = _create_enumerator, .acquire = _acquire, + .flush = _flush, .destroy = _destroy, }, .listener = { diff --git a/src/libcharon/sa/trap_manager.h b/src/libcharon/sa/trap_manager.h index 37b42e2..928b2a4 100644 --- a/src/libcharon/sa/trap_manager.h +++ b/src/libcharon/sa/trap_manager.h @@ -68,6 +68,11 @@ struct trap_manager_t { traffic_selector_t *src, traffic_selector_t *dst); /** + * Clear any installed trap. + */ + void (*flush)(trap_manager_t *this); + + /** * Destroy a trap_manager_t. */ void (*destroy)(trap_manager_t *this);