changeset 29245:b12fd2b3be63 v8.2.5141

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 <Bram@vim.org> 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".
author Bram Moolenaar <Bram@vim.org>
date Mon, 20 Jun 2022 14:45:03 +0200
parents 95a64cfeb60f
children 3415983cabfb
files src/os_unix.c src/os_win32.c src/proto/os_unix.pro src/proto/os_win32.pro src/regexp.c src/version.c
diffstat 6 files changed, 24 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- 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.
--- 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;
--- 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 : */
--- 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 : */
--- 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
 
 /*
--- 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,