From 39ff273df97e51b1285358b9e6808b117ea8adb1 Mon Sep 17 00:00:00 2001
From: Tavian Barnes <tavianator@tavianator.com>
Date: Thu, 10 Oct 2024 11:56:27 -0400
Subject: sighook: Don't forget to reset list->tail on the last sigpop()

This was causing a UAF if we ever unregistered the last hook for a
signal and then re-registered one.

Fixes: 75b7f70 ("sighook: Make sigunhook() O(1)")
---
 tests/sighook.c | 7 +++++++
 1 file changed, 7 insertions(+)

(limited to 'tests')

diff --git a/tests/sighook.c b/tests/sighook.c
index d785a55..0cb8de2 100644
--- a/tests/sighook.c
+++ b/tests/sighook.c
@@ -60,6 +60,13 @@ void check_sighook(void) {
 		return;
 	}
 
+	// Check that we can unregister and re-register a hook
+	sigunhook(hook);
+	hook = sighook(SIGALRM, alrm_hook, NULL, SH_CONTINUE);
+	if (!bfs_echeck(hook, "sighook(SIGALRM)")) {
+		return;
+	}
+
 	// Create a timer that sends SIGALRM every 100 microseconds
 	struct timespec ival = { .tv_nsec = 100 * 1000 };
 	struct timer *timer = xtimer_start(&ival);
-- 
cgit v1.2.3