NetBSD-Bugs archive

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

Re: PR/52117 CVS commit: src/tests/kernel



The following reply was made to PR kern/52117; it has been noted by GNATS.

From: Martin Husemann <martin%duskware.de@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc: n54%gmx.com@localhost
Subject: Re: PR/52117 CVS commit: src/tests/kernel
Date: Tue, 28 Mar 2017 21:55:03 +0200

 Ok, here is an alternative patch which seems to work for me:
 
 [..]
 Before calling wait4() for the child 38
 Reported PTRACE_FORK event with forkee 332
 Before calling wait4() for the forkee 332 of the child 38
 Before resuming the forkee process where it left off and without signal to be sent
 Before resuming the child process where it left off and without signal to be sent
 Before calling wait4() for the forkee - expected exited
 Before calling wait4() for the forkee - expected no process
 Before calling wait4() for the child - expected stopped SIGCHLD
 Before resuming the child process where it left off and without signal to be sent
 Before exiting of the child process
 Before calling wait4() for the child - expected exited
 Before calling wait4() for the child - expected no process
 failed: Test case was expecting a failure but none were raised
 
 
 It has the advantage of not touching all existing child_return, but doing the
 work earlier. It is slightly hackish, but kpsignal2 already has special case
 code for early signals, so I'd consider it OK.
 
 What do others think?
 
 Patch below, obvious removal from x86/x86/syscall.c ommited.
 
 Martin
 
 Index: kern_fork.c
 ===================================================================
 RCS file: /cvsroot/src/sys/kern/kern_fork.c,v
 retrieving revision 1.199
 diff -u -p -r1.199 kern_fork.c
 --- kern_fork.c	13 Jan 2017 23:00:35 -0000	1.199
 +++ kern_fork.c	28 Mar 2017 19:53:34 -0000
 @@ -500,6 +500,16 @@ fork1(struct lwp *l1, int flags, int exi
  	(*p2->p_emul->e_syscall_intern)(p2);
  #endif
  
 +	/* if we are being traced, give the owner a chance to interfere */
 +	if (p2->p_slflag & PSL_TRACED) {
 +		ksiginfo_t ksi;
 +
 +                KSI_INIT_EMPTY(&ksi);
 +		ksi.ksi_signo = SIGTRAP;
 +		ksi.ksi_lid = l2->l_lid;
 +		kpsignal(p2, &ksi, NULL);
 +	}
 +
  	/*
  	 * Update stats now that we know the fork was successful.
  	 */
 Index: kern_sig.c
 ===================================================================
 RCS file: /cvsroot/src/sys/kern/kern_sig.c,v
 retrieving revision 1.334
 diff -u -p -r1.334 kern_sig.c
 --- kern_sig.c	24 Mar 2017 17:40:44 -0000	1.334
 +++ kern_sig.c	28 Mar 2017 19:53:34 -0000
 @@ -1224,7 +1224,7 @@ kpsignal2(struct proc *p, ksiginfo_t *ks
  	ksiginfo_t *kp;
  	lwpid_t lid;
  	sig_t action;
 -	bool toall;
 +	bool toall, debtrap = false;
  	int error = 0;
  
  	KASSERT(!cpu_intr_p());
 @@ -1237,8 +1237,13 @@ kpsignal2(struct proc *p, ksiginfo_t *ks
  	 * If the process is being created by fork, is a zombie or is
  	 * exiting, then just drop the signal here and bail out.
  	 */
 -	if (p->p_stat != SACTIVE && p->p_stat != SSTOP)
 +	if (p->p_stat == SIDL && signo == SIGTRAP
 +	    && (p->p_slflag & PSL_TRACED)) {
 +		/* allow an initial SIGTRAP for traced processes */
 +		debtrap = true;
 +	} else if (p->p_stat != SACTIVE && p->p_stat != SSTOP) {
  		return 0;
 +	}
  
  	/* XXX for core dump/debugger */
  	p->p_sigctx.ps_lwp = ksi->ksi_lid;
 @@ -1353,7 +1358,13 @@ kpsignal2(struct proc *p, ksiginfo_t *ks
  	 * the signal to it.
  	 */
  	if (lid != 0) {
 -		l = lwp_find(p, lid);
 +		if (__predict_false(debtrap)) {
 +			l = LIST_FIRST(&p->p_lwps);
 +			if (l->l_lid != lid)
 +				l = NULL;
 +		} else {
 +			l = lwp_find(p, lid);
 +		}
  		if (l != NULL) {
  			if ((error = sigput(&l->l_sigpend, p, kp)) != 0)
  				goto out;
 


Home | Main Index | Thread Index | Old Index