summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorAhmad Fatoum <a.fatoum@pengutronix.de>2023-10-09 13:52:38 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2023-10-13 11:17:11 +0200
commit081b65cc42a7a2c8054ef1dfc1f633917251f99c (patch)
tree96a8babbc24248ae5f876c27ed8a2b6ff136d7db /lib
parentb41b1c25e966f1d305ab5b5ad791b0b7efa2bd82 (diff)
downloadbarebox-081b65cc42a7a2c8054ef1dfc1f633917251f99c.tar.gz
barebox-081b65cc42a7a2c8054ef1dfc1f633917251f99c.tar.xz
lib: stackprot: don't directly write stack protector from HWRNG driver
get_crypto_bytes itself or some function it calls down to the driver may require a stack protector, so passing the address of the stack protector value down may end up tripping the stack protector during function return. To avoid this, let's write the stack protector in a function chain that eithr has stack protector disabled or that never returns. This fixes a crash using the virtio RNG driver to generate the stack protector. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20231009115239.2291016-4-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'lib')
-rw-r--r--lib/stackprot.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/lib/stackprot.c b/lib/stackprot.c
index c1cc19aadd..7a8d0a4c10 100644
--- a/lib/stackprot.c
+++ b/lib/stackprot.c
@@ -16,7 +16,7 @@
void __stack_chk_fail(void);
-unsigned long __stack_chk_guard = (unsigned long)(0xfeedf00ddeadbeef & ~0UL);
+volatile ulong __stack_chk_guard = (ulong)(0xfeedf00ddeadbeef & ~0UL);
/*
* Called when gcc's -fstack-protector feature is used, and
@@ -30,11 +30,15 @@ EXPORT_SYMBOL(__stack_chk_fail);
static __no_stack_protector int stackprot_randomize_guard(void)
{
+ ulong chk_guard;
int ret;
- ret = get_crypto_bytes(&__stack_chk_guard, sizeof(__stack_chk_guard));
+ ret = get_crypto_bytes(&chk_guard, sizeof(chk_guard));
if (ret)
pr_warn("proceeding without randomized stack protector\n");
+ else
+ __stack_chk_guard = chk_guard;
+
return 0;
}
late_initcall(stackprot_randomize_guard);