Signal handlers must run before sigsuspend returns
authorLeon Timmermans <fawaka@gmail.com>
Mon, 26 Dec 2011 17:06:54 +0000 (19:06 +0200)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 29 Dec 2011 19:11:13 +0000 (11:11 -0800)
The whole point of sigsuspend and pause is to wait until a signal has
arrived, and then return *after* it has been triggered. Currently
delayed/"safe" signals prevent that from happening, which might cause
race conditions.

This patch prevents that (as far as possible) by running the signal
handlers ASAP.

ext/POSIX/POSIX.xs

index 27aabb5..1bad5e1 100644 (file)
@@ -1435,6 +1435,8 @@ sigpending(sigset)
        RETVAL = ix ? sigsuspend(sigset) : sigpending(sigset);
     OUTPUT:
        RETVAL
+    CLEANUP:
+    PERL_ASYNC_CHECK();
 
 SysRet
 sigprocmask(how, sigset, oldsigset = 0)
@@ -1880,6 +1882,8 @@ pathconf(filename, name)
 
 SysRet
 pause()
+    CLEANUP:
+    PERL_ASYNC_CHECK();
 
 SysRet
 setgid(gid)