mirror of
https://github.com/strongswan/strongswan.git
synced 2025-10-18 00:00:22 -04:00
unit-tests: Seed chunk_hash() only once, but before creating any hashtables
Due to the removal of pthread_once, we manually create the seed for chunk_hash(). With the new testable functions interface, this won't work for the hashtable initiated using __attribute__((constructor)). Enforce seeding before creating that hashtable.
This commit is contained in:
parent
5cd28cd25a
commit
460adb5d09
@ -243,7 +243,6 @@ bool library_init(char *settings, const char *namespace)
|
|||||||
{
|
{
|
||||||
private_library_t *this;
|
private_library_t *this;
|
||||||
printf_hook_t *pfh;
|
printf_hook_t *pfh;
|
||||||
static bool seeded = FALSE;
|
|
||||||
|
|
||||||
if (lib)
|
if (lib)
|
||||||
{ /* already initialized, increase refcount */
|
{ /* already initialized, increase refcount */
|
||||||
@ -252,13 +251,7 @@ bool library_init(char *settings, const char *namespace)
|
|||||||
return !this->integrity_failed;
|
return !this->integrity_failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!seeded)
|
chunk_hash_seed();
|
||||||
{
|
|
||||||
/* we do this just once to allow hash table lifetimes longer than
|
|
||||||
* one init/deinit cycle. */
|
|
||||||
seeded = TRUE;
|
|
||||||
chunk_hash_seed();
|
|
||||||
}
|
|
||||||
|
|
||||||
INIT(this,
|
INIT(this,
|
||||||
.public = {
|
.public = {
|
||||||
|
@ -44,6 +44,9 @@ void testable_functions_create()
|
|||||||
{
|
{
|
||||||
if (!testable_functions)
|
if (!testable_functions)
|
||||||
{
|
{
|
||||||
|
/* as this is executed before chunk_hash() seed initialization used
|
||||||
|
* by hashtables, we enforce seeding it here. */
|
||||||
|
chunk_hash_seed();
|
||||||
testable_functions = hashtable_create(hashtable_hash_str,
|
testable_functions = hashtable_create(hashtable_hash_str,
|
||||||
hashtable_equals_str, 8);
|
hashtable_equals_str, 8);
|
||||||
}
|
}
|
||||||
|
@ -917,10 +917,17 @@ static u_char static_key[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
|||||||
*/
|
*/
|
||||||
void chunk_hash_seed()
|
void chunk_hash_seed()
|
||||||
{
|
{
|
||||||
|
static bool seeded = FALSE;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
size_t done = 0;
|
size_t done = 0;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
|
if (seeded)
|
||||||
|
{
|
||||||
|
/* just once to have the same seed during the whole process lifetimes */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
fd = open("/dev/urandom", O_RDONLY);
|
fd = open("/dev/urandom", O_RDONLY);
|
||||||
if (fd >= 0)
|
if (fd >= 0)
|
||||||
{
|
{
|
||||||
@ -944,6 +951,7 @@ void chunk_hash_seed()
|
|||||||
key[done] = (u_char)random();
|
key[done] = (u_char)random();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
seeded = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -343,7 +343,8 @@ bool chunk_printable(chunk_t chunk, chunk_t *sane, char replace);
|
|||||||
* Seed initial key for chunk_hash().
|
* Seed initial key for chunk_hash().
|
||||||
*
|
*
|
||||||
* This call should get invoked once during startup. This is usually done
|
* This call should get invoked once during startup. This is usually done
|
||||||
* by calling library_init().
|
* by calling library_init(). Calling it multiple times is safe, it gets
|
||||||
|
* executed just once.
|
||||||
*/
|
*/
|
||||||
void chunk_hash_seed();
|
void chunk_hash_seed();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user