bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: raise, signal on MSVC


From: Bruno Haible
Subject: Re: raise, signal on MSVC
Date: Sat, 24 Sep 2011 01:07:11 +0200
User-agent: KMail/1.13.6 (Linux/2.6.37.6-0.5-desktop; KDE/4.6.0; x86_64; ; )

> First, a renewed 'raise' module.

Then, a wrapper around signal() in the 'sigprocmask' module. Most programs
use sigaction() by now, which is provided by gnulib on MSVC, therefore
there is no big urgency in adding a module for the signal() function.


2011-09-23  Bruno Haible  <address@hidden>

        sigprocmask: Avoid crashes through signal() on MSVC 9.
        * lib/sigprocmask.c: Include msvc-inval.h.
        (signal_nothrow): New function.
        (signal): Redefine it.
        * m4/signalblocking.m4 (gl_PREREQ_SIGPROCMASK): Require AC_C_INLINE.
        * modules/sigprocmask (Depends-on): Add msvc-inval.
        * doc/posix-functions/signal.texi: Mention the problem on MSVC.

--- doc/posix-functions/signal.texi.orig        Sat Sep 24 01:04:40 2011
+++ doc/posix-functions/signal.texi     Sat Sep 24 00:55:29 2011
@@ -13,6 +13,9 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+This function crashes when invoked with invalid arguments on some platforms:
+MSVC 9.
address@hidden
 On System V platforms, when the signal is triggered, the kernel uninstalls the
 handler (i.e.@: resets the signal's action to SIG_DFL) before invoking the
 handler.  This opens the door to race conditions: undesired things happen
--- lib/sigprocmask.c.orig      Sat Sep 24 01:04:40 2011
+++ lib/sigprocmask.c   Sat Sep 24 01:04:22 2011
@@ -24,6 +24,8 @@
 #include <stdint.h>
 #include <stdlib.h>
 
+#include "msvc-inval.h"
+
 /* We assume that a platform without POSIX signal blocking functions
    also does not have the POSIX sigaction() function, only the
    signal() function.  We also assume signal() has SysV semantics,
@@ -58,6 +60,28 @@
 
 typedef void (*handler_t) (int);
 
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static inline handler_t
+signal_nothrow (int sig, handler_t handler)
+{
+  handler_t result;
+
+  TRY_MSVC_INVAL
+    {
+      result = signal (sig, handler);
+    }
+  CATCH_MSVC_INVAL
+    {
+      result = SIG_ERR;
+      errno = EINVAL;
+    }
+  DONE_MSVC_INVAL;
+
+  return result;
+}
+# define signal signal_nothrow
+#endif
+
 /* Handling of gnulib defined signals.  */
 
 #if GNULIB_defined_SIGPIPE
@@ -80,6 +104,7 @@
       return signal (sig, handler);
     }
 }
+# undef signal
 # define signal ext_signal
 #endif
 
--- m4/signalblocking.m4.orig   Sat Sep 24 01:04:40 2011
+++ m4/signalblocking.m4        Fri Sep 23 23:39:20 2011
@@ -1,4 +1,4 @@
-# signalblocking.m4 serial 12
+# signalblocking.m4 serial 13
 dnl Copyright (C) 2001-2002, 2006-2011 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -22,4 +22,6 @@
 ])
 
 # Prerequisites of lib/sigprocmask.c.
-AC_DEFUN([gl_PREREQ_SIGPROCMASK], [:])
+AC_DEFUN([gl_PREREQ_SIGPROCMASK], [
+  AC_REQUIRE([AC_C_INLINE])
+])
--- modules/sigprocmask.orig    Sat Sep 24 01:04:40 2011
+++ modules/sigprocmask Fri Sep 23 23:38:44 2011
@@ -9,6 +9,7 @@
 signal
 stdint          [test $HAVE_POSIX_SIGNALBLOCKING = 0]
 raise           [test $HAVE_POSIX_SIGNALBLOCKING = 0]
+msvc-inval      [test $HAVE_POSIX_SIGNALBLOCKING = 0]
 
 configure.ac:
 gl_SIGNALBLOCKING
-- 
In memoriam Ghazala Khan <http://en.wikipedia.org/wiki/Ghazala_Khan>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]