Date: Mon, 02 Sep 2002 11:29:28 +0900 From: TOMITA Yoshinori <yoshint@flab.fujitsu.co.jp> To: Martin Kraemer <Martin.Kraemer@Fujitsu-Siemens.com> Cc: FreeBSD-stable@FreeBSD.ORG, tcsh@mx.gw.com Subject: Re: Strange bug: tcsh stops reading .tcshrc after 4kB Message-ID: <ywlwuq5gm47.fsf@cerberus.proc.flab.fujitsu.co.jp> In-Reply-To: <20020829111414.A54912@deejai2.mch.fsc.net> (Martin Kraemer's message of "Thu, 29 Aug 2002 11:14:14 %2B0200") References: <20020829111414.A54912@deejai2.mch.fsc.net>
next in thread | previous in thread | raw e-mail | index | archive | help
Hi, Martin.
>> On Thu, 29 Aug 2002 11:14:14 +0200, Martin Kraemer
>> <Martin.Kraemer@Fujitsu-Siemens.com> said:
Ma> On FreeBSD (I assume this is related to the bug) I "often"
Ma> experience a very strange bug which was not there in the past.
Ma> It manifests by tcsh not finishing reading all of .tcshrc (or/and
Ma> .login).
Ma> Especially strange is the fact that it does not always happen, but
Ma> only when tcsh is started from the x11 window manager directly,
Ma> not (or at least, not always) when started from another tcsh. The
Ma> exact trigger is still unknown to me.
I also experienced the very similar problem after cvsup around 2002-08-22,
on both 4.6-STABLE and 5-CURRENT.
From my quick investigation, I found that the trigger was "unset"
command in ~/.cshrc. And I guess that NLS catalogues are something to
do with this problem.
I checked with ktrace output and tcsh-6.12.00 source files.
1. open tcsh.cat. file descriptor is 3
62220 tcsh CALL open(0xbfbfd590,0,0x1b6)
62220 tcsh NAMI "/usr/local/share/nls/C/tcsh.cat"
62220 tcsh RET open 3
....
2. sh.misc.c:closem()
file descriptor 0-63(except some) are closed.
62220 tcsh CALL close(0)
62220 tcsh RET close 0
62220 tcsh CALL close(0x1)
62220 tcsh RET close 0
*** FD 3, which is bounded to tcsh.cat, is also closed here.
3. open ~/.cshrc, file descriptor is 3
62220 tcsh NAMI "/root/.cshrc"
62220 tcsh RET open 0
62220 tcsh CALL dup(0)
62220 tcsh RET dup 1
62220 tcsh CALL dup(0x1)
62220 tcsh RET dup 2
62220 tcsh CALL dup(0x2)
62220 tcsh RET dup 3
62220 tcsh CALL close(0x2)
62220 tcsh RET close 0
62220 tcsh CALL close(0x1)
62220 tcsh RET close 0
62220 tcsh CALL close(0)
62220 tcsh RET close 0
62220 tcsh CALL fcntl(0x3,0x2,0x1)
62220 tcsh RET fcntl 0
...
4. read 4096 bytes from .cshrc
62220 tcsh CALL read(0x3,0xbfbfc83c,0x1000)
62220 tcsh GIO fd 3 read 4096 bytes
5. evaluate "unset" command in ~/.cshrc
6. In sh.set.c:unset(), "catclose(catd)" will close FD 3, which
is bounded to ~/.cshrc !!!
62220 tcsh CALL close(0x3)
62220 tcsh RET close 0
7. open tcsh.cat again
62220 tcsh CALL open(0xbfbfb150,0,0x1b6)
62220 tcsh NAMI "/usr/local/share/nls/C/tcsh.cat"
62220 tcsh RET open 3
8. When 4096-byte buffer of ~/.cshrc becomes empty, tcsh will read
from FD 3 for the rest of ~/.cshrc.
But you cannot read ~/.cshrc any more.
62220 tcsh CALL read(0x3,0xbfbfa7bc,0x1000)
62220 tcsh GIO fd 3 read 0 bytes
""
62220 tcsh RET read 0
My nasty workaround is to comment out the two lines in sh.set.c:
(void) catclose(catd);
nlsinit();
--
TOMITA Yoshinori
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?ywlwuq5gm47.fsf>
