Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 04 Nov 2003 19:49:03 +0000
From:      Peter Edwards <peter.edwards@openet-telecom.com>
To:        David Schultz <das@FreeBSD.ORG>
Cc:        Igor Serikov <bt@turtle.freedns.us>
Subject:   Re: rfork problem
Message-ID:  <3FA802AF.4030107@openet-telecom.com>
In-Reply-To: <20031104191526.GA79079@VARK.homeunix.com>
References:  <3FA61A17.70605@turtle.freedns.us> <20031104081800.GA78439@VARK.homeunix.com> <3FA76D43.1040508@turtle.freedns.us> <20031104191526.GA79079@VARK.homeunix.com>

next in thread | previous in thread | raw e-mail | index | archive | help
David Schultz wrote:

>On Tue, Nov 04, 2003, Igor Serikov wrote:
>  
>
>>  David,
>>
>>Is it okay to have a condition that can be created by a mortal user and 
>>then cannot be changed by the root? The waiting process cannot be killed 
>>and would keep "waiting" till system reboot.
>>    
>>
>
>Aah, I see.  No, it's not okay that a non-root user can create an
>unkillable process.  -CURRENT doesn't have this problem because it
>rightly fails when a userland program tries to use RFPPWAIT.  (It
>isn't supposed to be available to userland, which is why it isn't
>documented.)  The problem could be fixed by backporting the
>relevant bits from -CURRENT.  
>
>  
>
>>I do not think it is a good idea to make ppwait state uninterruptible in 
>>any case.
>>    
>>
>
>I do not think it would be safe to deliver a signal to a parent
>process while a vforked child is borrowing its address space.
>
>Here's a patch against -STABLE:
>
>Index: kern_fork.c
>===================================================================
>RCS file: /cvs/src/sys/kern/kern_fork.c,v
>retrieving revision 1.72.2.15
>diff -u -r1.72.2.15 kern_fork.c
>--- kern_fork.c	28 Sep 2003 11:08:31 -0000	1.72.2.15
>+++ kern_fork.c	4 Nov 2003 19:13:33 -0000
>@@ -130,6 +130,9 @@
> 	int error;
> 	struct proc *p2;
> 
>+	/* Don't allow kernel only flags. */
>+	if ((uap->flags & RFKERNELONLY) != 0)
>+		return (EINVAL);
> 	error = fork1(p, uap->flags, &p2);
> 	if (error == 0) {
> 		p->p_retval[0] = p2 ? p2->p_pid : 0;
>_______________________________________________
>freebsd-hackers@freebsd.org mailing list
>http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
>To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"
>  
>

I don't think -STABLE defines RFKERNELONLY (or some of the other rfork 
flags), so you need to add

Index: unistd.h
===================================================================
RCS file: /pub/FreeBSD/development/FreeBSD-CVS/src/sys/sys/unistd.h,v
retrieving revision 1.22.2.2
diff -u -r1.22.2.2 unistd.h
--- unistd.h    22 Aug 2000 01:46:30 -0000      1.22.2.2
+++ unistd.h    4 Nov 2003 19:46:03 -0000
@@ -218,6 +218,7 @@
 #define RFSIGSHARE     (1<<14) /* share signal handlers */
 #define RFLINUXTHPN     (1<<16) /* do linux clone exit parent 
notification */
 #define RFPPWAIT       (1<<31) /* parent sleeps until child exits 
(vfork) */
+#define RFKERNELONLY   RFPPWAIT
 
 #endif /* !_POSIX_SOURCE */
 







Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3FA802AF.4030107>