Skip to content

Commit

Permalink
vsprintf: initialize siphash key using notifier
Browse files Browse the repository at this point in the history
Rather than polling every second, use the new notifier to do this at
exactly the right moment.

Reviewed-by: Petr Mladek <pmladek@suse.com>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
  • Loading branch information
Jason A. Donenfeld authored and Jason A. Donenfeld committed Nov 22, 2022
1 parent bbc7e1b commit 898f1e5
Showing 1 changed file with 5 additions and 9 deletions.
14 changes: 5 additions & 9 deletions lib/vsprintf.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
#include <linux/siphash.h>
#include <linux/compiler.h>
#include <linux/property.h>
#include <linux/notifier.h>
#ifdef CONFIG_BLOCK
#include <linux/blkdev.h>
#endif
Expand Down Expand Up @@ -752,26 +753,21 @@ early_param("debug_boot_weak_hash", debug_boot_weak_hash_enable);

static bool filled_random_ptr_key __read_mostly;
static siphash_key_t ptr_key __read_mostly;
static void fill_ptr_key_workfn(struct work_struct *work);
static DECLARE_DELAYED_WORK(fill_ptr_key_work, fill_ptr_key_workfn);

static void fill_ptr_key_workfn(struct work_struct *work)
static int fill_ptr_key(struct notifier_block *nb, unsigned long action, void *data)
{
if (!rng_is_initialized()) {
queue_delayed_work(system_unbound_wq, &fill_ptr_key_work, HZ * 2);
return;
}

get_random_bytes(&ptr_key, sizeof(ptr_key));

/* Pairs with smp_rmb() before reading ptr_key. */
smp_wmb();
WRITE_ONCE(filled_random_ptr_key, true);
return NOTIFY_DONE;
}

static int __init vsprintf_init_hashval(void)
{
fill_ptr_key_workfn(NULL);
static struct notifier_block fill_ptr_key_nb = { .notifier_call = fill_ptr_key };
execute_with_initialized_rng(&fill_ptr_key_nb);
return 0;
}
subsys_initcall(vsprintf_init_hashval)
Expand Down

0 comments on commit 898f1e5

Please sign in to comment.