]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
chunk: Don't depend on pthread directly
authorMartin Willi <martin@revosec.ch>
Fri, 18 Oct 2013 13:04:55 +0000 (15:04 +0200)
committerMartin Willi <martin@revosec.ch>
Wed, 4 Jun 2014 13:53:00 +0000 (15:53 +0200)
src/libstrongswan/library.c
src/libstrongswan/utils/chunk.c
src/libstrongswan/utils/chunk.h

index b06a2d5a569de6ea6c5f7ff02c70f429724ba841..c5850e15593c80a8770a707c2182ebd7ddfc46dd 100644 (file)
@@ -242,6 +242,7 @@ 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 */
@@ -250,6 +251,14 @@ 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();
+       }
+
        INIT(this,
                .public = {
                        .get = _get,
index 47181719a2d3422de77153d178cedd13861c656f..dd84d5106caff71c237a9125c77476d597f6caaa 100644 (file)
@@ -24,8 +24,8 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <errno.h>
-#include <pthread.h>
 #include <ctype.h>
+#include <time.h>
 
 #include "chunk.h"
 
@@ -884,9 +884,9 @@ u_int64_t chunk_mac(chunk_t chunk, u_char *key)
 }
 
 /**
- * Secret key allocated randomly during first use.
+ * Secret key allocated randomly with chunk_hash_seed().
  */
-static u_char key[16];
+static u_char key[16] = {};
 
 /**
  * Static key used in case predictable hash values are required.
@@ -895,15 +895,9 @@ static u_char static_key[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
                                                          0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
 
 /**
- * Only allocate the key once
+ * See header
  */
-static pthread_once_t key_allocated = PTHREAD_ONCE_INIT;
-
-/**
- * Allocate a key on first use, we do this manually to avoid dependencies on
- * plugins.
- */
-static void allocate_key()
+void chunk_hash_seed()
 {
        ssize_t len;
        size_t done = 0;
@@ -939,7 +933,6 @@ static void allocate_key()
  */
 u_int32_t chunk_hash_inc(chunk_t chunk, u_int32_t hash)
 {
-       pthread_once(&key_allocated, allocate_key);
        /* we could use a mac of the previous hash, but this is faster */
        return chunk_mac_inc(chunk, key, ((u_int64_t)hash) << 32 | hash);
 }
@@ -949,7 +942,6 @@ u_int32_t chunk_hash_inc(chunk_t chunk, u_int32_t hash)
  */
 u_int32_t chunk_hash(chunk_t chunk)
 {
-       pthread_once(&key_allocated, allocate_key);
        return chunk_mac(chunk, key);
 }
 
index 5a052a01309bad62951daf241f144291a441db37..760f922e19aadf0e29a3d323fcf9fea887624797 100644 (file)
@@ -339,6 +339,14 @@ bool chunk_increment(chunk_t chunk);
  */
 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().
+ */
+void chunk_hash_seed();
+
 /**
  * Computes a 32 bit hash of the given chunk.
  *