From owner-freebsd-bugs Fri Jul 16 13:32:23 1999 Delivered-To: freebsd-bugs@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.ORG [204.216.27.21]) by hub.freebsd.org (Postfix) with ESMTP id 03E2E14DA3 for ; Fri, 16 Jul 1999 13:32:20 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.9.3/8.9.2) id NAA82514; Fri, 16 Jul 1999 13:30:01 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: by hub.freebsd.org (Postfix, from userid 32767) id 3937F14CFD; Fri, 16 Jul 1999 13:24:07 -0700 (PDT) Message-Id: <19990716202407.3937F14CFD@hub.freebsd.org> Date: Fri, 16 Jul 1999 13:24:07 -0700 (PDT) From: ambrisko@whistle.com To: freebsd-gnats-submit@freebsd.org X-Send-Pr-Version: www-1.0 Subject: kern/12669: SA_NOCLDWAIT not cleared on exec Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org >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\5W, M)Y37P@_Z2CR+&1?>NHRS(":1E.ECPF*C_%W7)LP;"AC/A_C1#JC`PBBWXF+(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 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[;#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