[Top][All Lists]
[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>