From f8437dd8d2582d75aeec7933107bad9839fead74 Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Wed, 29 Jun 2011 12:08:24 +0200 Subject: [PATCH] Clear traps during shutdown before unloading kernel plugins --- src/libcharon/daemon.c | 4 ++++ src/libcharon/sa/trap_manager.c | 7 +++++++ src/libcharon/sa/trap_manager.h | 5 +++++ 3 files changed, 16 insertions(+) diff --git a/src/libcharon/daemon.c b/src/libcharon/daemon.c index 12c6b2a9e..f21a7951c 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 bb5c3f0b5..bf9f8432c 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 37b42e2b0..928b2a49f 100644 --- a/src/libcharon/sa/trap_manager.h +++ b/src/libcharon/sa/trap_manager.h @@ -67,6 +67,11 @@ struct trap_manager_t { void (*acquire)(trap_manager_t *this, u_int32_t reqid, traffic_selector_t *src, traffic_selector_t *dst); + /** + * Clear any installed trap. + */ + void (*flush)(trap_manager_t *this); + /** * Destroy a trap_manager_t. */