bin/52746: tcsh fails to handle large arguements
David Malone
dwmalone at maths.tcd.ie
Tue Jun 3 04:10:10 PDT 2003
The following reply was made to PR bin/52746; it has been noted by GNATS.
From: David Malone <dwmalone at maths.tcd.ie>
To: freebsd-gnats-submit at FreeBSD.org, marka at isc.org
Cc:
Subject: Re: bin/52746: tcsh fails to handle large arguements
Date: Tue, 03 Jun 2003 12:04:10 +0100
OK - I believe I understand the bug now. It looks like a tcsh bug
on platforms that have a real version of vfork. Here's what's
happening:
% /bin/echo `perl -e 'print "A"x1000000'`
1) tcsh vforks to produce what is intended to become /bin/echo,
I'll call this tcsh-echo. The original tcsh goes to sleep until
the vfork is done.
2) tcsh-echo forks, execs perl, adds perl to it's list of
helper processes. Because tcsh-echo is vforked, the original
tcsh can see this extra process in its process list.
3) tcsh-echo calls stderror when too many "A"s show up, and
stderr calls xexit. ktrace shows tcsh-echo exiting before
perl gets its SIGPIPE, so the perl is never reaped and
remains in the firends list for tcsh-echo.
4) tcsh resumes execution now that tcsh-echo has finished
running in vforked space. It starts waiting for tcsh-echo
and its friends to finish, but perl is stuck on the list.
So, a workaround is to disable the use of vfork 'cos the child then
ends up with its own address space and the perl never makes it into
the original tcsh's list of processes to wait for.
I've included some debugging output below, as it may be of use to
the tcsh people. I'll try and raise the issue with tcsh-bugs at mx.gw.com
David.
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
-echo tcsh RET read 4096/0x1000
-echo tcsh CALL write(0x2,0x8149b20,0xf)
-echo tcsh GIO fd 2 wrote 15 bytes
"Word too long.
"
-echo tcsh RET write 15/0xf
-echo tcsh CALL exit(0x1)
perl perl GIO fd 1 wrote 4096 bytes
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\
.
.
.
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
perl perl RET write 16384/0x4000
perl perl CALL write(0x1,0x8108000,0x4000)
perl perl RET write -1 errno 32 Broken pipe
perl perl PSIG SIGPIPE SIG_DFL
parent tcsh RET vfork -echo/0x1240e
% /bin/echo `perl -e 'print "A"x1000000'`
wanttty 75514 pid 75521 opgrp75521 pgrp 75514 tpgrp 75514
wanttty 75514 pid 75521 pgrp 75521 tpgrp 75521
wanttty -1 pid 75522 opgrp75522 pgrp 75521 tpgrp 75521
wanttty -1 pid 75522 pgrp 75521 tpgrp 75521
Word too long.
jobflags=0
jobflags for 75522 is 10101
jobflags for 75521 is 8
75514 starting to sigpause for SIGCHLD on 75522
More information about the freebsd-bugs
mailing list