Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 Jul 1999 13:24:07 -0700 (PDT)
From:      ambrisko@whistle.com
To:        freebsd-gnats-submit@freebsd.org
Subject:   kern/12669: SA_NOCLDWAIT not cleared on exec
Message-ID:  <19990716202407.3937F14CFD@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         12669
>Category:       kern
>Synopsis:       SA_NOCLDWAIT not cleared on exec
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Jul 16 13:30:00 PDT 1999
>Closed-Date:
>Last-Modified:
>Originator:     Doug Ambrisko
>Release:        4-current
>Organization:
Whistle
>Environment:
FreeBSD 770z.whistle.com 4.0-CURRENT FreeBSD 4.0-CURRENT #6: Thu Jul 15 19:31:19 PDT 1999     ambrisko@770z.whistle.com:/usr/home/ambrisko/current/usr/src/sys.foo/compile/THINK  i386
>Description:
I found a bug in FreeBSB with an old perl script that sets 
$SIG{"CHLD"}="IGNORE".  It seems to have broke ever since
SA_NOCLDWAIT has been implemented.  The issue seems that
SA_NOCLDWAIT should be reset after exec so some /bin/sh commands
then hang.  This is was Solaris apparently does so everything
works fine on Solaris even with pthread.

Note this is still broken for libc_r, however, on Solaris 
it works fine with pthreads.  I will investigate that later.

>How-To-Repeat:
Sample bug:
	perl -e '$SIG{"CHLD"}="IGNORE"; system ("echo hello | echo hang");'

C version:
begin 664 bug.tgz
M'XL(`&%6CS<``^V6;6_:,!"`^9K\BA-;:6`4DD#3:8Q)#*JN6E\FJ+8OE9";
M.(E%2!`V;=':_[YS0J!TZSIM@NZ#'REQ?&??G<_QRRD949]%M+!!+--TG"84
M`&S3=F2)F(L2L4P+P#EH-IQ]V[(:*+`<:[\`YB:#RIEQ0:8`!3*^FC(^2IYJ
M=Q-2&FTCH.VBZ]UN.W!=72=1]$[7IF/8\T%P(1];UUX;IYW/AV596ZN@JE:7
MPI<>@.*?P"FLN1OV\<SZMQN.F:]_RS8/Y/JWG`.U_K?!*Q:[T<RC\)[/>5W,
M)Y37P@_Z2CR+&1?>NHRS(":1E.ECPF*C_%W7)LP;"AC/A_C1#JC`PBBW<CF^
M\9O%`N<;$RYFO*7KFAO*U%>XF+(X0$'60EI/VH/CH^ZGDQ[V0O7,3<7$%2R)
M`8LJ)/A&Y77"/*B$)/8B.I6=AL='9RT==`WU-4Z&"Q6T8?$E+;*`CB=BSJDP
M2HMV8\)',MY%U8](P+&3^5ATUX9!9]@_'%QT^A<MJ%=@\+7?K$*SUGCS<="#
M2AU],Q^,=!C0QN;92*!4@F4PJ52&6M:U_!C\A9NS\^Y)[UOG^**UM)GE(+->
MA5*:BY),1EE:W;/0H#;!?`K?*![VS_N7<1&'M7"QU'PA4XJIQ@F(`[KFZ5+`
MC@<[;V_S!PU4LVFM/HRP]+#3FJ:ZGM$G7%]1/YG^N>OD:=]KJF5MX5WFS;A&
M5R.C+']3[;<I7$;[4[C$%SAOTL[&0]:T&\+PQ\S6B13<TXC3OPF^&[+(RU--
M;ZF[A>#I+09OIF'+%9VN7US>[2)UPP1"&D4)W(%+1+&UTJ5W"5M*\M`'N"T+
MV,5=2=`Q[/!=&5S67-K.Y,9*D/?K)3'-N^UF/_\JI'MU77F$3/NF+P#/G/]6
M>N?/SG^S83:EQ&Y:ZOS?!B]Y_JOS?F/G_6H_O!39(;#IC5]MK0J%0J%0*!0*
7A4*A4"@4"H5"H5#\-_P`7^B?80`H``#G
`
end


Machine without patch for resetting SA_NOCLDWAIT after exec.
  770z% gmake 
  rm -f tst tst2
  gmake tst
  gmake[1]: Entering directory `/usr/home/ambrisko'
  gcc     tst.c   -o tst
  gmake[1]: Leaving directory `/usr/home/ambrisko'
  gmake tst2
  gmake[1]: Entering directory `/usr/home/ambrisko'
  gcc     tst2.c   -o tst2
  gmake[1]: Leaving directory `/usr/home/ambrisko'
  ./tst
  Parent change SA_NOCLDWAIT       988       20       22        0
  Parent before SA_NOCLDWAIT       988        0        2        0
  Child before exec SA_NOCLDWAIT   988       20       22        0
  Parent after fork SA_NOCLDWAIT   988       20       22        0
  Start 'system ./tst2'
          Child SA_NOCLDWAIT       991       20       22        0
		[Then hangs]

Machine with patch for resetting SA_NOCLDWAIT after exec.
  dhcp2% make
  rm -f tst tst2
  make tst
  gcc -O -pipe  tst.c  -o tst
  make tst2
  gcc -O -pipe  tst2.c  -o tst2
  ./tst
  Parent change SA_NOCLDWAIT       284       20       22        0
  Parent before SA_NOCLDWAIT       284        0        2        0
  Child before exec SA_NOCLDWAIT   284       20       22        0
  Parent after fork SA_NOCLDWAIT   284       20       22        0
  Start 'system ./tst2'
          Child SA_NOCLDWAIT       287        0        2        0
  Done 'system'
  dhcp2% 

On Solaris 5.7
  % make
  rm -f tst tst2
  make tst
  make[1]: Entering directory `/a/207.76.205.244/root/usr/home/ambrisko'
  gcc     tst.c   -o tst
  make[1]: Leaving directory `/a/207.76.205.244/root/usr/home/ambrisko'
  make tst2
  make[1]: Entering directory `/a/207.76.205.244/root/usr/home/ambrisko'
  gcc     tst2.c   -o tst2
  make[1]: Leaving directory `/a/207.76.205.244/root/usr/home/ambrisko'
  ./tst
  Parent change SA_NOCLDWAIT       26241    10000    10004 effffb30
  Parent before SA_NOCLDWAIT       26241        0    20000 effffb30
  Child before exec SA_NOCLDWAIT   26241    10000    10000 effffb30
  Parent after fork SA_NOCLDWAIT   26241    10000    10000 effffb30
  Start 'system ./tst2'
          Child SA_NOCLDWAIT       26244        0    20000 effffb38
  Done 'system'
  %

>Fix:
Index: kern_sig.c
===================================================================
RCS file: /cvs/freebsd/src/sys/kern/kern_sig.c,v
retrieving revision 1.57
diff -r1.57 kern_sig.c
300a301,304
> 	/*
> 	 * Reset no zombies if child dies flag as Solaris does.
> 	 */
> 	p->p_procsig->ps_flag &= ~P_NOCLDWAIT;


>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




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