aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2014-04-03 11:46:09 +0200
committerMartin Willi <martin@revosec.ch>2014-06-04 15:53:11 +0200
commit460adb5d0925f4af807b09434b771545d1f62b47 (patch)
tree12c6bec9eb811c715d079e82e50840b865ecdb96 /src
parent5cd28cd25a009fd4d0d5b91b60e82cf7a661a169 (diff)
downloadstrongswan-460adb5d0925f4af807b09434b771545d1f62b47.tar.bz2
strongswan-460adb5d0925f4af807b09434b771545d1f62b47.tar.xz
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.
Diffstat (limited to 'src')
-rw-r--r--src/libstrongswan/library.c9
-rw-r--r--src/libstrongswan/tests/test_runner.c3
-rw-r--r--src/libstrongswan/utils/chunk.c8
-rw-r--r--src/libstrongswan/utils/chunk.h3
4 files changed, 14 insertions, 9 deletions
diff --git a/src/libstrongswan/library.c b/src/libstrongswan/library.c
index 93ff8400f..e3ad16411 100644
--- a/src/libstrongswan/library.c
+++ b/src/libstrongswan/library.c
@@ -243,7 +243,6 @@ bool library_init(char *settings, const char *namespace)
{
private_library_t *this;
printf_hook_t *pfh;
- static bool seeded = FALSE;
if (lib)
{ /* already initialized, increase refcount */
@@ -252,13 +251,7 @@ bool library_init(char *settings, const char *namespace)
return !this->integrity_failed;
}
- if (!seeded)
- {
- /* we do this just once to allow hash table lifetimes longer than
- * one init/deinit cycle. */
- seeded = TRUE;
- chunk_hash_seed();
- }
+ chunk_hash_seed();
INIT(this,
.public = {
diff --git a/src/libstrongswan/tests/test_runner.c b/src/libstrongswan/tests/test_runner.c
index 4684eb18d..63d79199f 100644
--- a/src/libstrongswan/tests/test_runner.c
+++ b/src/libstrongswan/tests/test_runner.c
@@ -44,6 +44,9 @@ void testable_functions_create()
{
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,
hashtable_equals_str, 8);
}
diff --git a/src/libstrongswan/utils/chunk.c b/src/libstrongswan/utils/chunk.c
index ef79a7453..1a9674f4d 100644
--- a/src/libstrongswan/utils/chunk.c
+++ b/src/libstrongswan/utils/chunk.c
@@ -917,10 +917,17 @@ static u_char static_key[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
*/
void chunk_hash_seed()
{
+ static bool seeded = FALSE;
ssize_t len;
size_t done = 0;
int fd;
+ if (seeded)
+ {
+ /* just once to have the same seed during the whole process lifetimes */
+ return;
+ }
+
fd = open("/dev/urandom", O_RDONLY);
if (fd >= 0)
{
@@ -944,6 +951,7 @@ void chunk_hash_seed()
key[done] = (u_char)random();
}
}
+ seeded = TRUE;
}
/**
diff --git a/src/libstrongswan/utils/chunk.h b/src/libstrongswan/utils/chunk.h
index 760f922e1..9951ff31f 100644
--- a/src/libstrongswan/utils/chunk.h
+++ b/src/libstrongswan/utils/chunk.h
@@ -343,7 +343,8 @@ bool chunk_printable(chunk_t chunk, chunk_t *sane, char replace);
* Seed initial key for chunk_hash().
*
* 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();