From: Tobias Brunner Date: Thu, 26 May 2016 14:57:31 +0000 (+0200) Subject: unit-tests: Provide a wrapper around bus_t::add_listener and unregister them during... X-Git-Tag: 5.5.0dr1~4^2~46 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5d10ef316da480a71720c5abe006f1c7066cd67f;p=thirdparty%2Fstrongswan.git unit-tests: Provide a wrapper around bus_t::add_listener and unregister them during cleanup 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. --- diff --git a/src/libcharon/tests/utils/exchange_test_helper.c b/src/libcharon/tests/utils/exchange_test_helper.c index 038cca07a0..d2187b985a 100644 --- a/src/libcharon/tests/utils/exchange_test_helper.c +++ b/src/libcharon/tests/utils/exchange_test_helper.c @@ -18,6 +18,7 @@ #include "mock_ipsec.h" #include "mock_nonce_gen.h" +#include #include 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); } diff --git a/src/libcharon/tests/utils/exchange_test_helper.h b/src/libcharon/tests/utils/exchange_test_helper.h index 6530f75640..6b19ec4a8d 100644 --- a/src/libcharon/tests/utils/exchange_test_helper.h +++ b/src/libcharon/tests/utils/exchange_test_helper.h @@ -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 {