Clear traps during shutdown before unloading kernel plugins
authorMartin Willi <martin@revosec.ch>
Wed, 29 Jun 2011 10:08:24 +0000 (12:08 +0200)
committerMartin Willi <martin@revosec.ch>
Mon, 12 Sep 2011 11:02:51 +0000 (13:02 +0200)
src/libcharon/daemon.c
src/libcharon/sa/trap_manager.c
src/libcharon/sa/trap_manager.h

index 12c6b2a..f21a795 100644 (file)
@@ -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 */
index bb5c3f0..bf9f843 100644 (file)
@@ -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 = {
index 37b42e2..928b2a4 100644 (file)
@@ -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);