]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
unit-tests: Provide a wrapper around bus_t::add_listener and unregister them during...
authorTobias Brunner <tobias@strongswan.org>
Thu, 26 May 2016 14:57:31 +0000 (16:57 +0200)
committerTobias Brunner <tobias@strongswan.org>
Fri, 17 Jun 2016 16:48:04 +0000 (18:48 +0200)
In case listeners on the stack are triggered while cleaning up after a
test failed (e.g. via ike_sa_manager_t::flush) remaining listeners defined on
the stack would cause a segmentation fault.

src/libcharon/tests/utils/exchange_test_helper.c
src/libcharon/tests/utils/exchange_test_helper.h

index 038cca07a087f45b7a69b0180860e56ba0673af9..d2187b985a5a3003186a8f8b33f5fba48e33122a 100644 (file)
@@ -18,6 +18,7 @@
 #include "mock_ipsec.h"
 #include "mock_nonce_gen.h"
 
+#include <collections/array.h>
 #include <credentials/sets/mem_cred.h>
 
 typedef struct private_exchange_test_helper_t private_exchange_test_helper_t;
@@ -42,6 +43,11 @@ struct private_exchange_test_helper_t {
         * IKE_SA SPI counter
         */
        refcount_t ike_spi;
+
+       /**
+        * List of registered listeners
+        */
+       array_t *listeners;
 };
 
 /**
@@ -240,6 +246,13 @@ METHOD(exchange_test_helper_t, establish_sa, void,
        DESTROY_IF(backend.ike_cfg);
 }
 
+METHOD(exchange_test_helper_t, add_listener, void,
+       private_exchange_test_helper_t *this, listener_t *listener)
+{
+       array_insert_create(&this->listeners, ARRAY_TAIL, listener);
+       charon->bus->add_listener(charon->bus, listener);
+}
+
 /**
  * Enable logging in charon as requested
  */
@@ -291,6 +304,7 @@ void exchange_test_helper_init(char *plugins)
                        .sender = mock_sender_create(),
                        .establish_sa = _establish_sa,
                        .process_message = _process_message,
+                       .add_listener = _add_listener,
                },
                .creds = mem_cred_create(),
        );
@@ -327,13 +341,19 @@ void exchange_test_helper_init(char *plugins)
 void exchange_test_helper_deinit()
 {
        private_exchange_test_helper_t *this;
+       listener_t *listener;
 
        this = (private_exchange_test_helper_t*)exchange_test_helper;
 
+       while (array_remove(this->listeners, ARRAY_HEAD, &listener))
+       {
+               charon->bus->remove_listener(charon->bus, listener);
+       }
        lib->credmgr->remove_set(lib->credmgr, &this->creds->set);
        this->creds->destroy(this->creds);
        /* can't let charon do it as it happens too late */
        charon->sender->destroy(charon->sender);
        charon->sender = NULL;
+       array_destroy(this->listeners);
        free(this);
 }
index 6530f7564038f427f093c6f24bf824872dd7c70b..6b19ec4a8dfa63ede469e5fcde62ffd312674de7 100644 (file)
@@ -67,6 +67,18 @@ struct exchange_test_helper_t {
         */
        void (*process_message)(exchange_test_helper_t *this, ike_sa_t *sa,
                                                        message_t *message);
+
+       /**
+        * Register a listener with the bus.
+        *
+        * Don't use bus_t::add_listener() directly for listeners on the stack
+        * as that could lead to invalid listeners registered when hooks are
+        * triggered during cleanup if a test case fails.  All of the listeners
+        * added this way are unregistered with the bus before cleaning up.
+        *
+        * @param listener              listener to add to the bus
+        */
+       void (*add_listener)(exchange_test_helper_t *this, listener_t *listener);
 };
 
 struct exchange_test_sa_conf_t {