commit 95562252ec3cf5848ad859e5849d5a7693ff4c3b
parent 8920f12853192c7a285623560d699c6feb6d3f5e
Author: Jochen Sprickerhof <git@jochen.sprickerhof.de>
Date: Thu, 25 Feb 2021 23:53:02 +0100
Track multikeypendingtimer creation state
Calling timer_delete with an invalid timer is unspecified behavior so we
need to track of the timer was created before. See
https://sourceware.org/pipermail/libc-alpha/2005-August/019335.html
For a discussion.
This fixes a segfault when linking with glibc.
Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
Diffstat:
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/dwm.c b/dwm.c
@@ -1292,13 +1292,17 @@ void keypresstimerdispatch(int msduration, int data)
{
struct sigevent timer_signal_event;
struct itimerspec timer_period;
+ static int multikeypendingtimer_created = 0;
// Clear out the old timer if any set,and dispatch new timer
- timer_delete(multikeypendingtimer);
+ if (multikeypendingtimer_created) {
+ timer_delete(multikeypendingtimer);
+ }
timer_signal_event.sigev_notify = SIGEV_THREAD;
timer_signal_event.sigev_notify_function = keypresstimerdone;
timer_signal_event.sigev_value.sival_int = data;
timer_signal_event.sigev_notify_attributes = NULL;
timer_create(CLOCK_MONOTONIC, &timer_signal_event, &multikeypendingtimer);
+ multikeypendingtimer_created = 1;
timer_period.it_value.tv_sec = 0;
timer_period.it_value.tv_nsec = msduration * 1000000;
timer_period.it_interval.tv_sec = 0;