# HG changeset patch # User Bram Moolenaar # Date 1655729103 -7200 # Node ID b12fd2b3be63ca86b589fc35608f01861ea17a39 # Parent 95a64cfeb60fc2fa611cbefd88c4cf9ca72d220f patch 8.2.5141: using "volatile int" in a signal handler might be wrong Commit: https://github.com/vim/vim/commit/155f2d1451949d1124bfd6ba9c55be6bd74bab75 Author: Bram Moolenaar Date: Mon Jun 20 13:38:33 2022 +0100 patch 8.2.5141: using "volatile int" in a signal handler might be wrong Problem: Using "volatile int" in a signal handler might be wrong. Solution: Use "volatile sig_atomic_t". diff --git a/src/os_unix.c b/src/os_unix.c --- a/src/os_unix.c +++ b/src/os_unix.c @@ -8251,9 +8251,9 @@ xsmp_close(void) /* * Implement timeout with timer_create() and timer_settime(). */ -static volatile int timeout_flag = FALSE; -static timer_t timer_id; -static int timer_created = FALSE; +static volatile sig_atomic_t timeout_flag = FALSE; +static timer_t timer_id; +static int timer_created = FALSE; /* * Callback for when the timer expires. @@ -8296,7 +8296,7 @@ stop_timeout(void) * This function is not expected to fail, but if it does it will still return a * valid flag pointer; the flag will remain stuck as FALSE . */ - volatile int * + volatile sig_atomic_t * start_timeout(long msec) { struct itimerspec interval = { @@ -8347,17 +8347,16 @@ delete_timer(void) } } -# else +# else // HAVE_TIMER_CREATE /* * Implement timeout with setitimer() */ -static struct itimerval prev_interval; -static struct sigaction prev_sigaction; -static volatile int timeout_flag = FALSE; -static int timer_active = FALSE; -static int timer_handler_active = FALSE; -static int alarm_pending = FALSE; +static struct sigaction prev_sigaction; +static volatile sig_atomic_t timeout_flag = FALSE; +static int timer_active = FALSE; +static int timer_handler_active = FALSE; +static volatile sig_atomic_t alarm_pending = FALSE; /* * Handle SIGALRM for a timeout. @@ -8383,7 +8382,7 @@ stop_timeout(void) if (timer_active) { timer_active = FALSE; - ret = setitimer(ITIMER_REAL, &disarm, &prev_interval); + ret = setitimer(ITIMER_REAL, &disarm, NULL); if (ret < 0) // Should only get here as a result of coding errors. semsg(_(e_could_not_clear_timeout_str), strerror(errno)); @@ -8398,7 +8397,7 @@ stop_timeout(void) semsg(_(e_could_not_reset_handler_for_timeout_str), strerror(errno)); } - timeout_flag = 0; + timeout_flag = FALSE; } /* @@ -8412,7 +8411,7 @@ stop_timeout(void) * This function is not expected to fail, but if it does it will still return a * valid flag pointer; the flag will remain stuck as FALSE . */ - volatile int * + volatile sig_atomic_t * start_timeout(long msec) { struct itimerval interval = { @@ -8461,7 +8460,7 @@ start_timeout(long msec) timer_handler_active = TRUE; // Set up the interval timer once the alarm handler is in place. - ret = setitimer(ITIMER_REAL, &interval, &prev_interval); + ret = setitimer(ITIMER_REAL, &interval, NULL); if (ret < 0) { // Should only get here as a result of coding errors. diff --git a/src/os_win32.c b/src/os_win32.c --- a/src/os_win32.c +++ b/src/os_win32.c @@ -8334,9 +8334,9 @@ static int timer_active = FALSE; * deleted. Ping-ponging between the two flags prevents this causing 'fake' * timeouts. */ -static int timeout_flags[2]; -static int timeout_flag_idx = 0; -static int *timeout_flag = &timeout_flags[0]; +static sig_atomic_t timeout_flags[2]; +static int timeout_flag_idx = 0; +static sig_atomic_t *timeout_flag = &timeout_flags[0]; static void CALLBACK @@ -8378,7 +8378,7 @@ stop_timeout(void) * This function is not expected to fail, but if it does it still returns a * valid flag pointer; the flag will remain stuck at zero. */ - volatile int * + volatile sig_atomic_t * start_timeout(long msec) { BOOL ret; diff --git a/src/proto/os_unix.pro b/src/proto/os_unix.pro --- a/src/proto/os_unix.pro +++ b/src/proto/os_unix.pro @@ -87,6 +87,6 @@ int xsmp_handle_requests(void); void xsmp_init(void); void xsmp_close(void); void stop_timeout(void); -volatile int *start_timeout(long msec); +volatile sig_atomic_t *start_timeout(long msec); void delete_timer(void); /* vim: set ft=c : */ diff --git a/src/proto/os_win32.pro b/src/proto/os_win32.pro --- a/src/proto/os_win32.pro +++ b/src/proto/os_win32.pro @@ -85,5 +85,5 @@ int get_conpty_fix_type(void); void resize_console_buf(void); char *GetWin32Error(void); void stop_timeout(void); -volatile int *start_timeout(long msec); +volatile sig_atomic_t *start_timeout(long msec); /* vim: set ft=c : */ diff --git a/src/regexp.c b/src/regexp.c --- a/src/regexp.c +++ b/src/regexp.c @@ -21,8 +21,8 @@ #endif #ifdef FEAT_RELTIME -static int dummy_timeout_flag = 0; -static volatile int *timeout_flag = &dummy_timeout_flag; +static sig_atomic_t dummy_timeout_flag = 0; +static volatile sig_atomic_t *timeout_flag = &dummy_timeout_flag; #endif /* diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -735,6 +735,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 5141, +/**/ 5140, /**/ 5139,