libstrongswan can be initialized more than once

This commit is contained in:
Martin Willi
2012-11-14 10:14:31 +01:00
parent cbd52e7ddc
commit 1e5e1fb685
2 changed files with 30 additions and 4 deletions
+27 -4
View File
@@ -44,12 +44,22 @@ struct private_library_t {
* Hashtable with registered objects (name => object) * Hashtable with registered objects (name => object)
*/ */
hashtable_t *objects; hashtable_t *objects;
/**
* Integrity check failed?
*/
bool integrity_failed;
/**
* Number of times we have been initialized
*/
refcount_t ref;
}; };
/** /**
* library instance * library instance
*/ */
library_t *lib; library_t *lib = NULL;
/** /**
* Deinitialize library * Deinitialize library
@@ -59,6 +69,11 @@ void library_deinit()
private_library_t *this = (private_library_t*)lib; private_library_t *this = (private_library_t*)lib;
bool detailed; bool detailed;
if (!this || !ref_put(&this->ref))
{ /* have more users */
return;
}
detailed = lib->settings->get_bool(lib->settings, detailed = lib->settings->get_bool(lib->settings,
"libstrongswan.leak_detective.detailed", TRUE); "libstrongswan.leak_detective.detailed", TRUE);
@@ -142,11 +157,19 @@ bool library_init(char *settings)
private_library_t *this; private_library_t *this;
printf_hook_t *pfh; printf_hook_t *pfh;
if (lib)
{ /* already initialized, increase refcount */
this = (private_library_t*)lib;
ref_get(&this->ref);
return !this->integrity_failed;
}
INIT(this, INIT(this,
.public = { .public = {
.get = _get, .get = _get,
.set = _set, .set = _set,
}, },
.ref = 1,
); );
lib = &this->public; lib = &this->public;
@@ -204,14 +227,14 @@ bool library_init(char *settings)
if (!lib->integrity->check(lib->integrity, "libstrongswan", library_init)) if (!lib->integrity->check(lib->integrity, "libstrongswan", library_init))
{ {
DBG1(DBG_LIB, "integrity check of libstrongswan failed"); DBG1(DBG_LIB, "integrity check of libstrongswan failed");
return FALSE; this->integrity_failed = TRUE;
} }
#else /* !INTEGRITY_TEST */ #else /* !INTEGRITY_TEST */
DBG1(DBG_LIB, "integrity test enabled, but not supported"); DBG1(DBG_LIB, "integrity test enabled, but not supported");
return FALSE; this->integrity_failed = TRUE;
#endif /* INTEGRITY_TEST */ #endif /* INTEGRITY_TEST */
} }
return TRUE; return !this->integrity_failed;
} }
+3
View File
@@ -202,6 +202,9 @@ struct library_t {
/** /**
* Initialize library, creates "lib" instance. * Initialize library, creates "lib" instance.
* *
* library_init() may be called multiple times in a single process, but each
* caller should call library_deinit() for each call to library_init().
*
* @param settings file to read settings from, may be NULL for default * @param settings file to read settings from, may be NULL for default
* @return FALSE if integrity check failed * @return FALSE if integrity check failed
*/ */