This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
POSIX: Check signal numbers against negatives.
authorJarkko Hietaniemi <jhi@iki.fi>
Thu, 4 Feb 2016 01:06:38 +0000 (20:06 -0500)
committerJarkko Hietaniemi <jhi@iki.fi>
Sun, 7 Feb 2016 13:23:46 +0000 (08:23 -0500)
CID 135020: Argument cannot be negative (NEGATIVE_RETURNS)
CID 135021: Argument cannot be negative (NEGATIVE_RETURNS)

sigismember()
sigaddset()
sigdelset()

Note that sigaction() already has its own handling for the signal number.

ext/POSIX/POSIX.xs
ext/POSIX/typemap

index a8f67d9..7b9d056 100644 (file)
@@ -1395,6 +1395,7 @@ typedef int SysRet;
 typedef long SysRetLong;
 typedef sigset_t* POSIX__SigSet;
 typedef HV* POSIX__SigAction;
+typedef int POSIX__SigNo;
 #ifdef I_TERMIOS
 typedef struct termios* POSIX__Termios;
 #else /* Define termios types to int, and call not_here for the functions.*/
@@ -1893,7 +1894,7 @@ new(packname = "POSIX::SigSet", ...)
 SysRet
 addset(sigset, sig)
        POSIX::SigSet   sigset
-       int             sig
+       POSIX::SigNo    sig
    ALIAS:
        delset = 1
    CODE:
@@ -1914,7 +1915,7 @@ emptyset(sigset)
 int
 sigismember(sigset, sig)
        POSIX::SigSet   sigset
-       int             sig
+       POSIX::SigNo    sig
 
 MODULE = Termios       PACKAGE = POSIX::Termios        PREFIX = cf
 
index 32cd17b..45a9fc7 100644 (file)
@@ -14,6 +14,7 @@ cc_t                  T_IV
 POSIX::SigSet          T_OPAQUEPTROBJ
 POSIX::Termios         T_OPAQUEPTROBJ
 POSIX::SigAction       T_HVREF
+POSIX::SigNo           T_SIGNO
 
 INPUT
 T_OPAQUEPTROBJ
@@ -27,6 +28,13 @@ T_OPAQUEPTROBJ
                        \"$var\", \"$ntype\");
        }
 
+T_SIGNO
+       if ((sig = SvIV($arg)) < 0) {
+          croak(\"%s: Negative signals are not allowed %d\",
+               ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
+                                   sig);
+       }
+
 OUTPUT
 T_OPAQUEPTROBJ
        sv_setref_pvn($arg, \"${ntype}\", (const char*)$var, sizeof(*$var));