svn commit: r301573 - in head: lib/libc/sys sys/kern sys/sys
Mariusz Zaborski
oshogbo at FreeBSD.org
Wed Jun 8 02:09:16 UTC 2016
Author: oshogbo
Date: Wed Jun 8 02:09:14 2016
New Revision: 301573
URL: https://svnweb.freebsd.org/changeset/base/301573
Log:
Introduce the PD_CLOEXEC for pdfork(2).
Reviewed by: mjg
Modified:
head/lib/libc/sys/pdfork.2
head/sys/kern/kern_fork.c
head/sys/kern/sys_procdesc.c
head/sys/sys/procdesc.h
Modified: head/lib/libc/sys/pdfork.2
==============================================================================
--- head/lib/libc/sys/pdfork.2 Wed Jun 8 02:03:53 2016 (r301572)
+++ head/lib/libc/sys/pdfork.2 Wed Jun 8 02:09:14 2016 (r301573)
@@ -32,7 +32,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd April 7, 2014
+.Dd June 8, 2016
.Dt PDFORK 2
.Os
.Sh NAME
@@ -80,6 +80,10 @@ This option is not permitted in
capability mode (see
.Xr cap_enter 2 ) .
.El
+.Bl -tag -width ".Dv PD_DAEMON"
+.It Dv PD_CLOEXEC
+Set close-on-exec on process descriptor.
+.El
.Pp
.Fn pdgetpid
queries the process ID (PID) in the process descriptor
Modified: head/sys/kern/kern_fork.c
==============================================================================
--- head/sys/kern/kern_fork.c Wed Jun 8 02:03:53 2016 (r301572)
+++ head/sys/kern/kern_fork.c Wed Jun 8 02:09:14 2016 (r301573)
@@ -827,6 +827,10 @@ fork1(struct thread *td, struct fork_req
/* Must provide a place to put a procdesc if creating one. */
if (fr->fr_pd_fd == NULL)
return (EINVAL);
+
+ /* Check if we are using supported flags. */
+ if ((fr->fr_pd_flags & ~PD_ALLOWED_AT_FORK) != 0)
+ return (EINVAL);
}
p1 = td->td_proc;
@@ -878,8 +882,8 @@ fork1(struct thread *td, struct fork_req
* later.
*/
if (flags & RFPROCDESC) {
- error = falloc_caps(td, &fp_procdesc, fr->fr_pd_fd, 0,
- fr->fr_pd_fcaps);
+ error = procdesc_falloc(td, &fp_procdesc, fr->fr_pd_fd,
+ fr->fr_pd_flags, fr->fr_pd_fcaps);
if (error != 0)
goto fail2;
}
Modified: head/sys/kern/sys_procdesc.c
==============================================================================
--- head/sys/kern/sys_procdesc.c Wed Jun 8 02:03:53 2016 (r301572)
+++ head/sys/kern/sys_procdesc.c Wed Jun 8 02:09:14 2016 (r301573)
@@ -243,6 +243,22 @@ procdesc_new(struct proc *p, int flags)
}
/*
+ * Create a new process decriptor for the process that refers to it.
+ */
+int
+procdesc_falloc(struct thread *td, struct file **resultfp, int *resultfd,
+ int flags, struct filecaps *fcaps)
+{
+ int fflags;
+
+ fflags = 0;
+ if (flags & PD_CLOEXEC)
+ fflags = O_CLOEXEC;
+
+ return (falloc_caps(td, resultfp, resultfd, fflags, fcaps));
+}
+
+/*
* Initialize a file with a process descriptor.
*/
void
Modified: head/sys/sys/procdesc.h
==============================================================================
--- head/sys/sys/procdesc.h Wed Jun 8 02:03:53 2016 (r301572)
+++ head/sys/sys/procdesc.h Wed Jun 8 02:09:14 2016 (r301573)
@@ -101,6 +101,9 @@ void procdesc_finit(struct procdesc *,
pid_t procdesc_pid(struct file *);
void procdesc_reap(struct proc *);
+int procdesc_falloc(struct thread *, struct file **, int *, int,
+ struct filecaps *);
+
#else /* !_KERNEL */
#include <sys/_types.h>
@@ -127,5 +130,8 @@ __END_DECLS
* Flags which can be passed to pdfork(2).
*/
#define PD_DAEMON 0x00000001 /* Don't exit when procdesc closes. */
+#define PD_CLOEXEC 0x00000002 /* Close file descriptor on exec. */
+
+#define PD_ALLOWED_AT_FORK (PD_DAEMON | PD_CLOEXEC)
#endif /* !_SYS_PROCDESC_H_ */
More information about the svn-src-all
mailing list