]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.5141: using "volatile int" in a signal handler might be wrong v8.2.5141
authorBram Moolenaar <Bram@vim.org>
Mon, 20 Jun 2022 12:38:33 +0000 (13:38 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 20 Jun 2022 12:38:33 +0000 (13:38 +0100)
Problem:    Using "volatile int" in a signal handler might be wrong.
Solution:   Use "volatile sig_atomic_t".

src/os_unix.c
src/os_win32.c
src/proto/os_unix.pro
src/proto/os_win32.pro
src/regexp.c
src/version.c

index 947f46f856ebb3e8fcf3084a59b8903c8f62cd65..260a84724276eada9344483d340ef8bf4b7be398 100644 (file)
@@ -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.
index f3259350591ee5436cd12bebff4372da92a9f28a..6af504693f41054ec4469870f8c94537c3fa7bf5 100644 (file)
@@ -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;
index a8e961b375c1d0fba3a2eb87a2851c84b6d2c8fc..f30b78d26cd677e7015756e5099b75413e20fb77 100644 (file)
@@ -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 : */
index dd2c27e85ea0d6649fce50eec693634451718c96..66335601ed295a10afe5dfd36f60a330f03856a3 100644 (file)
@@ -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 : */
index 32661f6d8a64f0a7ca0aabffd37ae6c94962bba8..3c1334ddd9dd47a281dc11d9606c084a861a001f 100644 (file)
@@ -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
 
 /*
index 5b5b405fe228cfdedd05c0218f6d2f361a90d153..99522846c63f4c544ea132b494f322496957d2df 100644 (file)
@@ -734,6 +734,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    5141,
 /**/
     5140,
 /**/