diff options
author | Martin Willi <martin@revosec.ch> | 2012-10-25 14:33:09 +0200 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2012-11-14 10:14:31 +0100 |
commit | 1e5e1fb6851962aaebd7a2fb3ceb928a8993b717 (patch) | |
tree | 6c7146557625e3b62ba136a116972004b16e3723 | |
parent | cbd52e7ddc368dbbc88d236c3f2ce856ce96a6b3 (diff) | |
download | strongswan-1e5e1fb6851962aaebd7a2fb3ceb928a8993b717.tar.bz2 strongswan-1e5e1fb6851962aaebd7a2fb3ceb928a8993b717.tar.xz |
libstrongswan can be initialized more than once
-rw-r--r-- | src/libstrongswan/library.c | 31 | ||||
-rw-r--r-- | src/libstrongswan/library.h | 3 |
2 files changed, 30 insertions, 4 deletions
diff --git a/src/libstrongswan/library.c b/src/libstrongswan/library.c index 2a8dda7e1..30a7774df 100644 --- a/src/libstrongswan/library.c +++ b/src/libstrongswan/library.c @@ -44,12 +44,22 @@ struct private_library_t { * Hashtable with registered objects (name => object) */ hashtable_t *objects; + + /** + * Integrity check failed? + */ + bool integrity_failed; + + /** + * Number of times we have been initialized + */ + refcount_t ref; }; /** * library instance */ -library_t *lib; +library_t *lib = NULL; /** * Deinitialize library @@ -59,6 +69,11 @@ void library_deinit() private_library_t *this = (private_library_t*)lib; bool detailed; + if (!this || !ref_put(&this->ref)) + { /* have more users */ + return; + } + detailed = lib->settings->get_bool(lib->settings, "libstrongswan.leak_detective.detailed", TRUE); @@ -142,11 +157,19 @@ bool library_init(char *settings) private_library_t *this; 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, .public = { .get = _get, .set = _set, }, + .ref = 1, ); lib = &this->public; @@ -204,14 +227,14 @@ bool library_init(char *settings) if (!lib->integrity->check(lib->integrity, "libstrongswan", library_init)) { DBG1(DBG_LIB, "integrity check of libstrongswan failed"); - return FALSE; + this->integrity_failed = TRUE; } #else /* !INTEGRITY_TEST */ DBG1(DBG_LIB, "integrity test enabled, but not supported"); - return FALSE; + this->integrity_failed = TRUE; #endif /* INTEGRITY_TEST */ } - return TRUE; + return !this->integrity_failed; } diff --git a/src/libstrongswan/library.h b/src/libstrongswan/library.h index 43c6b33d3..6f455a617 100644 --- a/src/libstrongswan/library.h +++ b/src/libstrongswan/library.h @@ -202,6 +202,9 @@ struct library_t { /** * 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 * @return FALSE if integrity check failed */ |