Segmentation fault in csh if "setenv LC_ALL C" is sourced

David Wolfskill david at
Tue Dec 23 13:11:10 PST 2003

This was a rather surprising development this morning.

I had updated my -STABLE sources per my daily ritual, then did the
usual "make buildworld" & friends and rebooted.  I logged in (via xdm's
login screen, as usual), and got a login screen before I had a chance to
enter my SSH passphrase.  Repeated attempts yielded the same effect.

I switched to a vty and logged in ... and was presented with a login
prompt immediately.  This was also repeatable.  :-{

I logged in as root -- successfully.

I moved aside ~david/.cshrc, and was then able to login as "david".

I then tried "source" and found that csh got a Segmentation
fault while processing that directive.  Trying various incantations with
"csh -x" indicated that there was something about the "setenv LC_ALL C"
line in my ~/.cshrc that it didn't like at all, so I created a new
~/.cshrc like the old one, but without that line (and the one before
it); csh seemed to cope with that OK.

So here's the result from what debugging I've done so far.  I confess
that I'm fairly rusty with gdb, but I'm willing to poke aroud:

Script started on Tue Dec 23 12:25:20 2003
localhost(4.9-S)[1] uname -a
FreeBSD localhost 4.9-STABLE FreeBSD 4.9-STABLE #24: Tue Dec 23 06:23:02 PST 2003     root at  i386
localhost(4.9-S)[2] diff -u .cshrc
---	Thu Sep 18 05:56:33 2003
+++ .cshrc	Tue Dec 23 06:39:14 2003
@@ -125,8 +125,8 @@
 setenv PAGER less
 setenv RNINIT ~/.rninit
-setenv LANG en_US.ISO8859-1
-setenv LC_ALL C
+# setenv LANG en_US.ISO8859-1
+# setenv LC_ALL C
 unset autologout
 set history = 900
 unset noclobber
localhost(4.9-S)[3] csh -x
localhost(4.9-S)[1] source
set npath = 
if ( 1 ) then
set dir = ~/bin/FreeBSD
if ( -d /home/david/bin/FreeBSD ) then
if ( 1 ) then
if { test -n /home/david/bin/FreeBSD } then
test -n /home/david/bin/FreeBSD
if ( -d /home/david/bin/FreeBSD ) then
set npath = /home/david/bin/FreeBSD
setenv SYMONHOME /opt/SUNWsymon
set path = ( /home/david/bin/FreeBSD ~/bin /bin /usr/bin /sbin /usr/sbin /usr/local/sbin /usr/local/bin /usr/local/pbm /usr/local/rdb /usr/local/bin/mh /usr/share/bin /usr/ucb /usr/local/games /usr/games /usr/X11R6/bin /usr/local/etc /usr/etc /etc /usr/local/office52/program )
set HOST = `hostname | sed -e 's/\..*$//'`
sed -e s/\..*$//
if ( ! 0 ) then
if ( 1 != 0 ) then
if { test -z %m(4.9-S)[%h]  } exit
test -z %m(4.9-S)[%h] 
set u = `uname -r`
uname -r
set ul = `echo ${u} | sed -e 's/-.*//'`
sed -e s/-.*//
echo 4.9-STABLE
set ur = `echo ${u} | sed -e 's/^[^-]*-//'`
sed -e s/^[^-]*-//
echo 4.9-STABLE
switch ( STABLE )
set ur = -S
set u = 4.9-S
if ( ! 1 ) then
set prompt = %m(4.9-S)[%h] 
switch ( FreeBSD )
setenv XAPPLRESDIR /usr/X11R6/lib/X11/app-defaults
setenv LD_LIBRARY_PATH /usr/lib:/usr/local/X11/lib:/usr/local/lib
setenv MY_WM tvtwm
setenv MANPATH ~/man:/usr/local/man:/usr/share/man:/usr/X11R6/man:/usr/local/lib/perl5/5.6.0/man:/usr/share/perl/man:/usr/local/lib/perl5/5.00503/man:/usr/local/games/man:/usr/local/lib/perl5/5.6.1/man
if ( 0 ) exit
setenv GROFF_TMAC_PATH /usr/local/tmac:.:/usr/share/groff/tmac
setenv ADDRPATH /home/david/addr:/home/david/addr/business
setenv PRINTER lp
setenv LPDEST lp
setenv EDITOR vi
setenv LESS -sMci
setenv CVSROOT /cvs
setenv HOSTALIASES ~/.hostaliases
setenv BLOCKSIZE 1k
setenv MM_NOASK image/*
setenv PAGER less
setenv RNINIT ~/.rninit
setenv LANG en_US.ISO8859-1
Segmentation fault (core dumped)
localhost(4.9-S)[4] echo "I built a debug csh in /usr/obj/usr/src/bin/csh"
I built a debug csh in /usr/obj/usr/src/bin/csh
localhost(4.9-S)[5] /usr/obj/usr/src/bin/csh/csh -x
localhost(4.9-S)[1] source
[very similar output to the above elided -- dhw]
setenv LANG en_US.ISO8859-1
Segmentation fault (core dumped)
localhost(4.9-S)[6]  ^Dexit

Script done on Tue Dec 23 12:57:51 2003

OK; here's what gdb said (via cut'n'paste):

localhost(4.9-S)[17] gdb /usr/obj/usr/src/bin/csh/csh csh.core 
GNU gdb 4.18 (FreeBSD)
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-unknown-freebsd"...Deprecated bfd_read called a
t /usr/src/gnu/usr.bin/binutils/gdb/../../../../contrib/gdb/gdb/dbxread.c line 2
627 in elfstab_build_psymtabs
Deprecated bfd_read called at /usr/src/gnu/usr.bin/binutils/gdb/../../../../cont
rib/gdb/gdb/dbxread.c line 933 in fill_symbuf

Core was generated by `csh'.
Program terminated with signal 11, Segmentation fault.
#0  0x80ad21f in __part_load_locale ()
(gdb) bt
#0  0x80ad21f in __part_load_locale ()
#1  0x80ad0bf in __monetary_load_locale ()
#2  0x8090296 in setlocale ()
#3  0x808fffc in setlocale ()
#4  0x8055fa5 in dosetenv (v=0x812fc40, c=0x8138e00)
    at /usr/src/bin/csh/../../contrib/tcsh/sh.func.c:1358
#5  0x80545dc in func (t=0x8138e00, bp=0x80df1f8)
    at /usr/src/bin/csh/../../contrib/tcsh/sh.func.c:145
#6  0x8061ca7 in execute (t=0x8138e00, wanttty=1210, pipein=0x0, pipeout=0x0, 
    do_glob=1) at /usr/src/bin/csh/../../contrib/tcsh/sh.sem.c:654
#7  0x8061f30 in execute (t=0x8132da0, wanttty=1210, pipein=0x0, pipeout=0x0, 
    do_glob=1) at /usr/src/bin/csh/../../contrib/tcsh/sh.sem.c:731
#8  0x804aab8 in process (catch=0)
    at /usr/src/bin/csh/../../contrib/tcsh/sh.c:2159
#9  0x804a349 in srcunit (unit=3, onlyown=0, hflg=0, av=0x812fde8)
    at /usr/src/bin/csh/../../contrib/tcsh/sh.c:1691
#10 0x8049d62 in srcfile (f=0xbfbfa130 "", onlyown=0, flag=0, 
    av=0x812fde8) at /usr/src/bin/csh/../../contrib/tcsh/sh.c:1470
#11 0x804ad63 in dosource (t=0x812fde0, c=0x815d3a0)
    at /usr/src/bin/csh/../../contrib/tcsh/sh.c:2205
#12 0x80545dc in func (t=0x815d3a0, bp=0x80df238)
    at /usr/src/bin/csh/../../contrib/tcsh/sh.func.c:145
#13 0x8061ca7 in execute (t=0x815d3a0, wanttty=1210, pipein=0x0, pipeout=0x0, 
---Type <return> to continue, or q <return> to quit--- 
    do_glob=1) at /usr/src/bin/csh/../../contrib/tcsh/sh.sem.c:654
#14 0x8061f30 in execute (t=0x815d380, wanttty=1210, pipein=0x0, pipeout=0x0, 
    do_glob=1) at /usr/src/bin/csh/../../contrib/tcsh/sh.sem.c:731
#15 0x804aab8 in process (catch=1)
    at /usr/src/bin/csh/../../contrib/tcsh/sh.c:2159
#16 0x8049b07 in main (argc=0, argv=0xbfbff53c)
    at /usr/src/bin/csh/../../contrib/tcsh/sh.c:1341
(gdb) frame 4
#4  0x8055fa5 in dosetenv (v=0x812fc40, c=0x8138e00)
    at /usr/src/bin/csh/../../contrib/tcsh/sh.func.c:1358
1358            (void) setlocale(LC_ALL, "");
(gdb) p dont_free
$1 = 0
(gdb) p k
$2 = 135461960
(gdb) frame 3
#3  0x808fffc in setlocale ()

And looking at the man page for setlocale(), I don't see anything special
regarding the second argument being a string of length 0.

I note further that along with tracking -STABLE on a daily basis,
I've also been tracking -CURRENT on a daily basis on the same
machine, using the same home directory (and thus, the same .cshrc).  And
I never saw this issue pop up on -CURRENT.

Am I the only one to see this?  Am I doing something wrong (or at least,

Thanks in advance for clues!

David H. Wolfskill				david at
If you want true virus-protection for your PC, install a non-Microsoft OS
on it.  Plausible candidates include FreeBSD, Linux, NetBSD, OpenBSD, and
Solaris (in alphabetical order).

More information about the freebsd-stable mailing list