From c228ad607c936ef81fd1f849fd496de04b832926 Mon Sep 17 00:00:00 2001 From: Andreas Steffen Date: Mon, 8 Nov 2010 22:21:53 +0100 Subject: [PATCH] abort if one of the IMCs or IMVs fail to initialize --- src/libcharon/plugins/tnc_imc/tnc_imc_manager.c | 6 ++---- src/libcharon/plugins/tnc_imc/tnc_imc_plugin.c | 21 ++++++++++++++++----- src/libcharon/plugins/tnc_imv/tnc_imv_manager.c | 5 ++--- src/libcharon/plugins/tnc_imv/tnc_imv_plugin.c | 22 +++++++++++++++++----- src/libcharon/tnc/imv/imv_manager.h | 2 +- 5 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/libcharon/plugins/tnc_imc/tnc_imc_manager.c b/src/libcharon/plugins/tnc_imc/tnc_imc_manager.c index bc1147a..5959ab6 100644 --- a/src/libcharon/plugins/tnc_imc/tnc_imc_manager.c +++ b/src/libcharon/plugins/tnc_imc/tnc_imc_manager.c @@ -90,11 +90,12 @@ METHOD(imc_manager_t, remove_, imc_t*, } } enumerator->destroy(enumerator); + return NULL; } METHOD(imc_manager_t, notify_connection_change, void, private_tnc_imc_manager_t *this, TNC_ConnectionID id, - TNC_ConnectionState state) + TNC_ConnectionState state) { enumerator_t *enumerator; imc_t *imc; @@ -208,8 +209,5 @@ imc_manager_t* tnc_imc_manager_create(void) .next_imc_id = 1, ); - return &this->public; } - - diff --git a/src/libcharon/plugins/tnc_imc/tnc_imc_plugin.c b/src/libcharon/plugins/tnc_imc/tnc_imc_plugin.c index 99baddc..05d7b7a 100644 --- a/src/libcharon/plugins/tnc_imc/tnc_imc_plugin.c +++ b/src/libcharon/plugins/tnc_imc/tnc_imc_plugin.c @@ -49,15 +49,26 @@ plugin_t *tnc_imc_plugin_create() /* Create IMC manager */ charon->imcs = tnc_imc_manager_create(); - /* Create and register IMCs */ - name = "Dummy"; - filename = "/usr/local/lib/libdummyimc.so"; - imc = tnc_imc_create(name, filename); - if (imc) + /** + * Create, register and initialize IMCs + * Abort if one of the IMCs fails to initialize successfully + */ { + name = "Dummy"; + filename = "/usr/local/lib/libdummyimc.so"; + imc = tnc_imc_create(name, filename); + if (!imc) + { + charon->imcs->destroy(charon->imcs); + free(this); + return NULL; + } if (!charon->imcs->add(charon->imcs, imc)) { imc->destroy(imc); + charon->imcs->destroy(charon->imcs); + free(this); + return NULL; } } return &this->plugin; diff --git a/src/libcharon/plugins/tnc_imv/tnc_imv_manager.c b/src/libcharon/plugins/tnc_imv/tnc_imv_manager.c index 667f1e3..2b00020 100644 --- a/src/libcharon/plugins/tnc_imv/tnc_imv_manager.c +++ b/src/libcharon/plugins/tnc_imv/tnc_imv_manager.c @@ -70,6 +70,7 @@ METHOD(imv_manager_t, add, bool, this->imvs->remove_last(this->imvs, (void**)&imv); return FALSE; } + return TRUE; } @@ -89,6 +90,7 @@ METHOD(imv_manager_t, remove_, imv_t*, } } enumerator->destroy(enumerator); + return NULL; } METHOD(imv_manager_t, notify_connection_change, void, @@ -192,8 +194,5 @@ imv_manager_t* tnc_imv_manager_create(void) .next_imv_id = 1, ); - return &this->public; } - - diff --git a/src/libcharon/plugins/tnc_imv/tnc_imv_plugin.c b/src/libcharon/plugins/tnc_imv/tnc_imv_plugin.c index f3b9bb0..4932105 100644 --- a/src/libcharon/plugins/tnc_imv/tnc_imv_plugin.c +++ b/src/libcharon/plugins/tnc_imv/tnc_imv_plugin.c @@ -47,15 +47,27 @@ plugin_t *tnc_imv_plugin_create() /* Create IMV manager */ charon->imvs = tnc_imv_manager_create(); - /* Create and register IMVs */ - name = "Dummy"; - filename = "/usr/local/lib/libdummyimv.so"; - imv = tnc_imv_create(name, filename); - if (imv) + /** + * Create, register and initialize IMVs + * Abort if one of the IMVs fails to initialize successfully + */ { + name = "Dummy"; + filename = "/usr/local/lib/libdummyimv.so"; + imv = tnc_imv_create(name, filename); + + if (!imv) + { + charon->imvs->destroy(charon->imvs); + free(this); + return NULL; + } if (!charon->imvs->add(charon->imvs, imv)) { imv->destroy(imv); + charon->imvs->destroy(charon->imvs); + free(this); + return NULL; } } return &this->plugin; diff --git a/src/libcharon/tnc/imv/imv_manager.h b/src/libcharon/tnc/imv/imv_manager.h index 56cb6a0..c7b21d1 100644 --- a/src/libcharon/tnc/imv/imv_manager.h +++ b/src/libcharon/tnc/imv/imv_manager.h @@ -46,7 +46,7 @@ struct imv_manager_t { * @param id ID of IMV instance * @return removed IMC instance */ - void (*remove)(imv_manager_t *this, TNC_IMVID id); + imv_t* (*remove)(imv_manager_t *this, TNC_IMVID id); /** * Notify all IMV instances -- 2.7.4