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_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;
}
+3
View File
@@ -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
*/