abort if one of the IMCs or IMVs fail to initialize
authorAndreas Steffen <andreas.steffen@strongswan.org>
Mon, 8 Nov 2010 21:21:53 +0000 (22:21 +0100)
committerAndreas Steffen <andreas.steffen@strongswan.org>
Tue, 9 Nov 2010 19:43:51 +0000 (20:43 +0100)
src/libcharon/plugins/tnc_imc/tnc_imc_manager.c
src/libcharon/plugins/tnc_imc/tnc_imc_plugin.c
src/libcharon/plugins/tnc_imv/tnc_imv_manager.c
src/libcharon/plugins/tnc_imv/tnc_imv_plugin.c
src/libcharon/tnc/imv/imv_manager.h

index bc1147a..5959ab6 100644 (file)
@@ -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;
 }
-
-
index 99baddc..05d7b7a 100644 (file)
@@ -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;
index 667f1e3..2b00020 100644 (file)
@@ -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;
 }
-
-
index f3b9bb0..4932105 100644 (file)
@@ -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;
index 56cb6a0..c7b21d1 100644 (file)
@@ -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