summaryrefslogtreecommitdiff
path: root/pp_sys.c
diff options
context:
space:
mode:
authorJarkko Hietaniemi <jhi@iki.fi>2015-08-26 08:55:37 -0400
committerJarkko Hietaniemi <jhi@iki.fi>2015-08-26 11:40:40 -0400
commit131d45a96c910d0fe46597ab156a35837879bf9c (patch)
tree0fca2751032d5ac423fae4e625eab7cce08386ec /pp_sys.c
parent5798d63101f7b13bd5aaf5a5bf429a8e08991016 (diff)
downloadperl-131d45a96c910d0fe46597ab156a35837879bf9c.tar.gz
Explicitly use and check for FD_CLOEXEC.
This may break places which have the FD_CLOEXEC functionality but do not have the FD_CLOEXEC define. In any case, using a boolean for the F_SETFD flag is icky. Using an explicit 1 is also dubious.
Diffstat (limited to 'pp_sys.c')
-rw-r--r--pp_sys.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/pp_sys.c b/pp_sys.c
index dc1b3cec1a..658dee19fa 100644
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -708,10 +708,10 @@ PP(pp_pipe_op)
PerlLIO_close(fd[1]);
goto badexit;
}
-#if defined(HAS_FCNTL) && defined(F_SETFD)
+#if defined(HAS_FCNTL) && defined(F_SETFD) && defined(FD_CLOEXEC)
/* ensure close-on-exec */
- if ((fcntl(fd[0], F_SETFD,fd[0] > PL_maxsysfd) < 0) ||
- (fcntl(fd[1], F_SETFD,fd[1] > PL_maxsysfd) < 0))
+ if ((fd[0] > PL_maxsysfd && fcntl(fd[0], F_SETFD, FD_CLOEXEC) < 0) ||
+ (fd[1] > PL_maxsysfd && fcntl(fd[1], F_SETFD, FD_CLOEXEC) < 0))
goto badexit;
#endif
RETPUSHYES;
@@ -2496,8 +2496,9 @@ PP(pp_socket)
if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
RETPUSHUNDEF;
}
-#if defined(HAS_FCNTL) && defined(F_SETFD)
- if (fcntl(fd, F_SETFD, fd > PL_maxsysfd) < 0) /* ensure close-on-exec */
+#if defined(HAS_FCNTL) && defined(F_SETFD) && defined(FD_CLOEXEC)
+ /* ensure close-on-exec */
+ if (fd > PL_maxsysfd && fcntl(fd, F_SETFD, FD_CLOEXEC) < 0)
RETPUSHUNDEF;
#endif
@@ -2542,10 +2543,10 @@ PP(pp_sockpair)
if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
RETPUSHUNDEF;
}
-#if defined(HAS_FCNTL) && defined(F_SETFD)
+#if defined(HAS_FCNTL) && defined(F_SETFD) && defined(FD_CLOEXEC)
/* ensure close-on-exec */
- if ((fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd) < 0) ||
- (fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd) < 0))
+ if ((fd[0] > PL_maxsysfd && fcntl(fd[0], F_SETFD, FD_CLOEXEC) < 0) ||
+ (fd[1] > PL_maxsysfd && fcntl(fd[1], F_SETFD, FD_CLOEXEC) < 0))
RETPUSHUNDEF;
#endif
@@ -2659,8 +2660,9 @@ PP(pp_accept)
if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
goto badexit;
}
-#if defined(HAS_FCNTL) && defined(F_SETFD)
- if (fcntl(fd, F_SETFD, fd > PL_maxsysfd) < 0) /* ensure close-on-exec */
+#if defined(HAS_FCNTL) && defined(F_SETFD) && defined(FD_CLOEXEC)
+ /* ensure close-on-exec */
+ if (fd > PL_maxsysfd && fcntl(fd, F_SETFD, FD_CLOEXEC) < 0)
goto badexit;
#endif
@@ -4386,7 +4388,7 @@ PP(pp_system)
#endif
if (did_pipes) {
PerlLIO_close(pp[0]);
-#if defined(HAS_FCNTL) && defined(F_SETFD)
+#if defined(HAS_FCNTL) && defined(F_SETFD) && defined(FD_CLOEXEC)
if (fcntl(pp[1], F_SETFD, FD_CLOEXEC) < 0)
RETPUSHUNDEF;
#endif