Allow str_map siphash key randomization
This commit is contained in:
parent
0058c1f457
commit
246bd92648
117
liberty.c
117
liberty.c
@ -659,6 +659,80 @@ error_propagate (struct error **destination, struct error *source)
|
|||||||
*destination = source;
|
*destination = source;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --- File descriptor utilities -----------------------------------------------
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_cloexec (int fd)
|
||||||
|
{
|
||||||
|
soft_assert (fcntl (fd, F_SETFD, fcntl (fd, F_GETFD) | FD_CLOEXEC) != -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
set_blocking (int fd, bool blocking)
|
||||||
|
{
|
||||||
|
int flags = fcntl (fd, F_GETFL);
|
||||||
|
hard_assert (flags != -1);
|
||||||
|
|
||||||
|
bool prev = !(flags & O_NONBLOCK);
|
||||||
|
if (blocking)
|
||||||
|
flags &= ~O_NONBLOCK;
|
||||||
|
else
|
||||||
|
flags |= O_NONBLOCK;
|
||||||
|
|
||||||
|
hard_assert (fcntl (fd, F_SETFL, flags) != -1);
|
||||||
|
return prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
xclose (int fd)
|
||||||
|
{
|
||||||
|
while (close (fd) == -1)
|
||||||
|
if (!soft_assert (errno == EINTR))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Randomness --------------------------------------------------------------
|
||||||
|
|
||||||
|
static bool
|
||||||
|
random_bytes (void *output, size_t len, struct error **e)
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
int fd = open ("/dev/urandom", O_RDONLY);
|
||||||
|
ssize_t got = 0;
|
||||||
|
|
||||||
|
if (fd < 0)
|
||||||
|
{
|
||||||
|
error_set (e, "%s: %s", "open", strerror (errno));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if ((got = read (fd, output, len)) < 0)
|
||||||
|
error_set (e, "%s: %s", "read", strerror (errno));
|
||||||
|
else if (got != (ssize_t) len)
|
||||||
|
error_set (e, "can't get enough bytes from the device");
|
||||||
|
else
|
||||||
|
result = true;
|
||||||
|
|
||||||
|
xclose (fd);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
|
static unsigned char g_siphash_key[16] = "SipHash 2-4 key!";
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
siphash_wrapper_randomize (void)
|
||||||
|
{
|
||||||
|
// I guess there's no real need to be this paranoic, so we ignore failures
|
||||||
|
soft_assert (random_bytes (g_siphash_key, sizeof g_siphash_key, NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint64_t
|
||||||
|
siphash_wrapper (const void *m, size_t len)
|
||||||
|
{
|
||||||
|
return siphash (g_siphash_key, m, len);
|
||||||
|
}
|
||||||
|
|
||||||
// --- String hash map ---------------------------------------------------------
|
// --- String hash map ---------------------------------------------------------
|
||||||
|
|
||||||
// The most basic <string, managed pointer> map (or associative array).
|
// The most basic <string, managed pointer> map (or associative array).
|
||||||
@ -728,24 +802,17 @@ str_map_free (struct str_map *self)
|
|||||||
self->map = NULL;
|
self->map = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t
|
|
||||||
str_map_hash (const char *s, size_t len)
|
|
||||||
{
|
|
||||||
static unsigned char key[16] = "SipHash 2-4 key!";
|
|
||||||
return siphash (key, (const void *) s, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint64_t
|
static uint64_t
|
||||||
str_map_pos (struct str_map *self, const char *s)
|
str_map_pos (struct str_map *self, const char *s)
|
||||||
{
|
{
|
||||||
size_t mask = self->alloc - 1;
|
size_t mask = self->alloc - 1;
|
||||||
return str_map_hash (s, strlen (s)) & mask;
|
return siphash_wrapper (s, strlen (s)) & mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t
|
static uint64_t
|
||||||
str_map_link_hash (struct str_map_link *self)
|
str_map_link_hash (struct str_map_link *self)
|
||||||
{
|
{
|
||||||
return str_map_hash (self->key, self->key_length);
|
return siphash_wrapper (self->key, self->key_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -959,38 +1026,6 @@ str_map_unset_iter_free (struct str_map_unset_iter *self)
|
|||||||
str_map_shrink (self->iter.map);
|
str_map_shrink (self->iter.map);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- File descriptor utilities -----------------------------------------------
|
|
||||||
|
|
||||||
static void
|
|
||||||
set_cloexec (int fd)
|
|
||||||
{
|
|
||||||
soft_assert (fcntl (fd, F_SETFD, fcntl (fd, F_GETFD) | FD_CLOEXEC) != -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
|
||||||
set_blocking (int fd, bool blocking)
|
|
||||||
{
|
|
||||||
int flags = fcntl (fd, F_GETFL);
|
|
||||||
hard_assert (flags != -1);
|
|
||||||
|
|
||||||
bool prev = !(flags & O_NONBLOCK);
|
|
||||||
if (blocking)
|
|
||||||
flags &= ~O_NONBLOCK;
|
|
||||||
else
|
|
||||||
flags |= O_NONBLOCK;
|
|
||||||
|
|
||||||
hard_assert (fcntl (fd, F_SETFL, flags) != -1);
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
xclose (int fd)
|
|
||||||
{
|
|
||||||
while (close (fd) == -1)
|
|
||||||
if (!soft_assert (errno == EINTR))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- Event loop --------------------------------------------------------------
|
// --- Event loop --------------------------------------------------------------
|
||||||
|
|
||||||
#ifdef LIBERTY_WANT_POLLER
|
#ifdef LIBERTY_WANT_POLLER
|
||||||
|
Loading…
Reference in New Issue
Block a user