Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

src: Remove the rnewprocp argument from fork1(9)



details:   https://anonhg.NetBSD.org/src/rev/f6467d1c2efa
branches:  trunk
changeset: 318238:f6467d1c2efa
user:      kamil <kamil%NetBSD.org@localhost>
date:      Mon Apr 16 14:51:59 2018 +0000
description:
Remove the rnewprocp argument from fork1(9)

It's now unused and it can cause use-after-free scenarios as noted by
<Mateusz Guzik>.

Reference: http://mail-index.netbsd.org/tech-kern/2017/09/08/msg022267.html

Sponsored by <The NetBSD Foundation>

diffstat:

 share/man/man9/fork1.9                |  13 +++----------
 sys/compat/freebsd/freebsd_fork.c     |   6 +++---
 sys/compat/linux/common/linux_sched.c |   6 +++---
 sys/kern/init_main.c                  |   6 +++---
 sys/kern/kern_fork.c                  |  21 +++++++--------------
 sys/sys/proc.h                        |   4 ++--
 6 files changed, 21 insertions(+), 35 deletions(-)

diffs (215 lines):

diff -r 56c0d645c19c -r f6467d1c2efa share/man/man9/fork1.9
--- a/share/man/man9/fork1.9    Mon Apr 16 14:39:19 2018 +0000
+++ b/share/man/man9/fork1.9    Mon Apr 16 14:51:59 2018 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: fork1.9,v 1.14 2008/04/30 13:10:58 martin Exp $
+.\"    $NetBSD: fork1.9,v 1.15 2018/04/16 14:51:59 kamil Exp $
 .\"
 .\" Copyright (c) 1998 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -28,7 +28,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd January 4, 2008
+.Dd April 16, 2018
 .Dt FORK1 9
 .Os
 .Sh NAME
@@ -38,7 +38,7 @@
 .In sys/types.h
 .In sys/proc.h
 .Ft int
-.Fn "fork1" "struct lwp *l1" "int flags" "int exitsig" "void *stack" "size_t stacksize" "void (*func)(void *)" "void *arg" "register_t *retval" "struct proc **rnewprocp"
+.Fn "fork1" "struct lwp *l1" "int flags" "int exitsig" "void *stack" "size_t stacksize" "void (*func)(void *)" "void *arg" "register_t *retval"
 .Sh DESCRIPTION
 .Fn fork1
 creates a new process out of the process behind
@@ -132,13 +132,6 @@
 and bitwise-AND it with
 .Ar retval[0] ,
 thus returning the pid to the parent process and 0 to the child.
-.Pp
-If
-.Ar rnewprocp
-is not NULL,
-.Ar *rnewprocp
-will point to the newly created process upon successful completion of
-the fork operation.
 .Sh RETURN VALUES
 Upon successful completion of the fork operation,
 .Fn fork1
diff -r 56c0d645c19c -r f6467d1c2efa sys/compat/freebsd/freebsd_fork.c
--- a/sys/compat/freebsd/freebsd_fork.c Mon Apr 16 14:39:19 2018 +0000
+++ b/sys/compat/freebsd/freebsd_fork.c Mon Apr 16 14:51:59 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: freebsd_fork.c,v 1.8 2017/08/08 08:04:06 maxv Exp $    */
+/*     $NetBSD: freebsd_fork.c,v 1.9 2018/04/16 14:51:59 kamil Exp $   */
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: freebsd_fork.c,v 1.8 2017/08/08 08:04:06 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: freebsd_fork.c,v 1.9 2018/04/16 14:51:59 kamil Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -81,5 +81,5 @@
 
        return (fork1(l, flags,
            SCARG(uap, flags) & FREEBSD_RFLINUXTHPN ? SIGUSR1 : SIGCHLD,
-           NULL, 0, NULL, NULL, retval, NULL));
+           NULL, 0, NULL, NULL, retval));
 }
diff -r 56c0d645c19c -r f6467d1c2efa sys/compat/linux/common/linux_sched.c
--- a/sys/compat/linux/common/linux_sched.c     Mon Apr 16 14:39:19 2018 +0000
+++ b/sys/compat/linux/common/linux_sched.c     Mon Apr 16 14:51:59 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: linux_sched.c,v 1.70 2018/04/15 03:25:25 kamil Exp $   */
+/*     $NetBSD: linux_sched.c,v 1.71 2018/04/16 14:51:59 kamil Exp $   */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_sched.c,v 1.70 2018/04/15 03:25:25 kamil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_sched.c,v 1.71 2018/04/16 14:51:59 kamil Exp $");
 
 #include <sys/param.h>
 #include <sys/mount.h>
@@ -158,7 +158,7 @@
         * that makes this adjustment is a noop.
         */
        if ((error = fork1(l, flags, sig, SCARG(uap, stack), 0,
-           linux_child_return, NULL, retval, NULL)) != 0) {
+           linux_child_return, NULL, retval)) != 0) {
                DPRINTF(("%s: fork1: error %d\n", __func__, error));
                return error;
        }
diff -r 56c0d645c19c -r f6467d1c2efa sys/kern/init_main.c
--- a/sys/kern/init_main.c      Mon Apr 16 14:39:19 2018 +0000
+++ b/sys/kern/init_main.c      Mon Apr 16 14:51:59 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: init_main.c,v 1.496 2018/04/16 14:18:16 kamil Exp $    */
+/*     $NetBSD: init_main.c,v 1.497 2018/04/16 14:51:59 kamil Exp $    */
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -97,7 +97,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.496 2018/04/16 14:18:16 kamil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.497 2018/04/16 14:51:59 kamil Exp $");
 
 #include "opt_ddb.h"
 #include "opt_inet.h"
@@ -608,7 +608,7 @@
         * wait for us to inform it that the root file system has been
         * mounted.
         */
-       if (fork1(l, 0, SIGCHLD, NULL, 0, start_init, NULL, NULL, NULL))
+       if (fork1(l, 0, SIGCHLD, NULL, 0, start_init, NULL, NULL))
                panic("fork init");
 
        /*
diff -r 56c0d645c19c -r f6467d1c2efa sys/kern/kern_fork.c
--- a/sys/kern/kern_fork.c      Mon Apr 16 14:39:19 2018 +0000
+++ b/sys/kern/kern_fork.c      Mon Apr 16 14:51:59 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: kern_fork.c,v 1.203 2017/11/07 19:44:04 christos Exp $ */
+/*     $NetBSD: kern_fork.c,v 1.204 2018/04/16 14:51:59 kamil Exp $    */
 
 /*-
  * Copyright (c) 1999, 2001, 2004, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_fork.c,v 1.203 2017/11/07 19:44:04 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_fork.c,v 1.204 2018/04/16 14:51:59 kamil Exp $");
 
 #include "opt_ktrace.h"
 #include "opt_dtrace.h"
@@ -117,7 +117,7 @@
 sys_fork(struct lwp *l, const void *v, register_t *retval)
 {
 
-       return fork1(l, 0, SIGCHLD, NULL, 0, NULL, NULL, retval, NULL);
+       return fork1(l, 0, SIGCHLD, NULL, 0, NULL, NULL, retval);
 }
 
 /*
@@ -129,7 +129,7 @@
 {
 
        return fork1(l, FORK_PPWAIT, SIGCHLD, NULL, 0, NULL, NULL,
-           retval, NULL);
+           retval);
 }
 
 /*
@@ -141,7 +141,7 @@
 {
 
        return fork1(l, FORK_PPWAIT|FORK_SHAREVM, SIGCHLD, NULL, 0,
-           NULL, NULL, retval, NULL);
+           NULL, NULL, retval);
 }
 
 /*
@@ -194,7 +194,7 @@
         * code that makes this adjustment is a noop.
         */
        return fork1(l, flags, sig, SCARG(uap, stack), 0,
-           NULL, NULL, retval, NULL);
+           NULL, NULL, retval);
 }
 
 /*
@@ -209,8 +209,7 @@
  */
 int
 fork1(struct lwp *l1, int flags, int exitsig, void *stack, size_t stacksize,
-    void (*func)(void *), void *arg, register_t *retval,
-    struct proc **rnewprocp)
+    void (*func)(void *), void *arg, register_t *retval)
 {
        struct proc     *p1, *p2, *parent;
        struct plimit   *p1_lim;
@@ -524,12 +523,6 @@
        if (flags & FORK_SHAREVM)
                uvmexp.forks_sharevm++;
 
-       /*
-        * Pass a pointer to the new process to the caller.
-        */
-       if (rnewprocp != NULL)
-               *rnewprocp = p2;
-
        if (ktrpoint(KTR_EMUL))
                p2->p_traceflag |= KTRFAC_TRC_EMUL;
 
diff -r 56c0d645c19c -r f6467d1c2efa sys/sys/proc.h
--- a/sys/sys/proc.h    Mon Apr 16 14:39:19 2018 +0000
+++ b/sys/sys/proc.h    Mon Apr 16 14:51:59 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: proc.h,v 1.344 2018/01/09 20:55:43 maya Exp $  */
+/*     $NetBSD: proc.h,v 1.345 2018/04/16 14:51:59 kamil Exp $ */
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -522,7 +522,7 @@
 void   proc_free_mem(struct proc *);
 void   exit_lwps(struct lwp *l);
 int    fork1(struct lwp *, int, int, void *, size_t,
-           void (*)(void *), void *, register_t *, struct proc **);
+           void (*)(void *), void *, register_t *);
 int    pgid_in_session(struct proc *, pid_t);
 void   cpu_lwp_fork(struct lwp *, struct lwp *, void *, size_t,
            void (*)(void *), void *);



Home | Main Index | Thread Index | Old Index