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

From: David Wolfskill (david_at_catwhisker.org)
Date: 12/23/03

  • Next message: Mike Tancsa: "Re: Segmentation fault in csh if "setenv LC_ALL C" is sourced"
    Date: Tue, 23 Dec 2003 13:11:07 -0800 (PST)
    To: stable@freebsd.org
    
    

    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 .cshrc.save" 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@d146.catwhisker.org:/common/S1/obj/usr/src/sys/LAPTOP_30W i386
    localhost(4.9-S)[2] diff -u .cshrc.save .cshrc
    --- .cshrc.save 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 FTP_PASSIVE_MODE
    -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 .cshrc.save
    source .cshrc.save
    set npath =
    if ( 1 ) then
    set dir = ~/bin/FreeBSD
    if ( -d /home/david/bin/FreeBSD ) then
    true
    else
    else
    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
    endif
    endif
    endif
    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/\..*$//'`
    hostname
    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
    breaksw
    set u = 4.9-S
    if ( ! 1 ) then
    set prompt = %m(4.9-S)[%h]
    endif
    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
    breaksw
    endif
    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 NNTPSERVER news.sf.sbcglobal.net
    setenv MM_NOASK image/*
    setenv PAGER less
    setenv RNINIT ~/.rninit
    setenv FTP_PASSIVE_MODE
    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 .cshrc.save
    source .cshrc.save
    [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 ".cshrc.save", 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 ()
    (gdb)

    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,
    unsupported)?

    Thanks in advance for clues!

    Peace,
    david

    -- 
    David H. Wolfskill				david@catwhisker.org
    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).
    _______________________________________________
    freebsd-stable@freebsd.org mailing list
    http://lists.freebsd.org/mailman/listinfo/freebsd-stable
    To unsubscribe, send any mail to "freebsd-stable-unsubscribe@freebsd.org"
    

  • Next message: Mike Tancsa: "Re: Segmentation fault in csh if "setenv LC_ALL C" is sourced"

    Relevant Pages