Date: Sun, 4 Jul 1999 04:10:03 -0700 (PDT) From: Juergen Lock <nox@jelal.kn-bremen.de> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/10064: /bin/sh called from make dumps core Message-ID: <199907041110.EAA69488@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/10064; it has been noted by GNATS. From: Juergen Lock <nox@jelal.kn-bremen.de> To: Sheldon Hearn <sheldonh@uunet.co.za> Cc: Juergen Lock <nox@jelal.kn-bremen.de>, freebsd-gnats-submit@freebsd.org Subject: Re: bin/10064: /bin/sh called from make dumps core Date: Sun, 4 Jul 1999 12:44:15 +0200 On Wed, Jun 23, 1999 at 04:52:10PM +0200, Sheldon Hearn wrote: > > > On Tue, 22 Jun 1999 23:12:11 +0200, Juergen Lock wrote: > > > Umm, i fixed this the redmond way, just looked at how it crashed > > and patched around the problem without actually trying to understand > > the code... > > Hi Juergen, > > Could you do me a huge favour? I've just gotten feedback from someone > who suspects that your problem was fixed in rev 1.26 of > src/bin/sh/expand.c ... > > Could you back your change out of your local source, get the expand.c > fix and see if the problem still exists? OK after several nightly runs of my i586-cygwin32 crossgcc build i finally go it to the point where it crashed. (I had to use a 2.1-stable system, with the right kernel, to get it to pass the right args to sh that make it die...) then i built the 3.2-stable sh on 2.1-stable cause the expand.c diff didn't apply to the 2.1-stable sh. well, the 3.2-stable sh didn't die (and the expand.c diff isn't yet MFC'd)! at least not at the same place where the 2.1-stable one died, didn't wait for the whole build to finish... A 2.2.5R sh also died I remembered, maybe the expand.c diff applies there. Well it did (more or less, had to apply it by hand), but it didn't fix the crash! Hmm so let's find out which patch makes it dissapear. After building several sh:s from the RELENG_2_2 branch i found out the 2.2.7R sh dies and the 2.2.8R sh doesn't, and the crucial patch is in parser.c (0parser228 below). undoing that patch in the 3.2-stable sh as well as in the -current sh cause both to crash, and that patch doesn't look like it could fix a stack bug, only mask it by using the stack differently, right? Anyway here comes the whole shebang, reduced to only the touched files: (unshar in an empty dir, set CVSROOT then run `crash'.) HTH, Juergen # This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # crash # kill11.c # 0parser228 # work # work/gnu-win32 # work/gnu-win32/src # work/gnu-win32/src/CROSS # work/gnu-win32/src/CROSS/i586-cygwin32 # work/gnu-win32/src/CROSS/i586-cygwin32/libstdc++ # work/gnu-win32/src/CROSS/i586-cygwin32/newlib # work/gnu-win32/src/CROSS/i586-cygwin32/newlib/Makefile # work/gnu-win32/src/CROSS/binutils # work/gnu-win32/src/CROSS/binutils/ar # work/gnu-win32/src/CROSS/gas # work/gnu-win32/src/CROSS/gas/as-new # work/gnu-win32/src/CROSS/gcc # work/gnu-win32/src/CROSS/gcc/xgcc # work/gnu-win32/src/libstdc++ # echo x - crash sed 's/^X//' >crash << 'END-of-crash' X#! /bin/sh Xcc -o kill11 kill11.c X# set CVSROOT; also try co -rRELENG_3 Xcvs co src/bin/sh src/usr.bin/printf Xpatch src/bin/sh/parser.c <0parser228 X(cd src/bin/sh/; make) Xecho hit return, or attach gdb then hit return X(cd work/gnu-win32/src/CROSS/; ../../../../kill11 ../../../../src/bin/sh/sh ) X# examine the core in work/gnu-win32/src/CROSS END-of-crash echo x - kill11.c sed 's/^X//' >kill11.c << 'END-of-kill11.c' X#include <stdio.h> X Xint main(int argc, char **argv) { X char *sh = argc == 2 ? argv[1] : "/bin/sh"; X return execl (sh, sh, "-c", "read x; dir=`echo configure-target-libstdc++ | sed -e 's/configure-target-//'`; if [ ! -d i586-cygwin32 ]; then true; elif [ -f i586-cygwin32/${dir}/Makefile ] ; then true; elif echo \" libiberty newlib libio librx libstdc++ libg++ examples winsup \" | grep \" ${dir} \" >/dev/null 2>&1; then if [ -d ../${dir} ]; then [ -d i586-cygwin32/${dir} ] || mkdir i586-cygwin32/${dir}; r=`pwd`; export r; s=`cd ..; pwd`; export s; AR=\"` if [ -f $r/binutils/ar ] ; then echo $r/binutils/ar ; else if [ \"i386-unknown-freebsd2.1.7\" = \"i586-pc-cygwin32\" ] ; then echo ar; else t='-e s,^,i586-cygwin32-, '; echo ar | sed -e 's/x/x/' $t ; fi; fi`\"; export AR; AS=\"` if [ -f $r/gas/as-new ] ; then echo $r/gas/as-new ; else if [ \"i386-unknown-freebsd2.1.7\" = \"i586-pc-cygwin32\" ] ; then echo as; else t='-e s,^,i586-cygwin32-, '; echo as | sed -e 's/x/x/' $t ; fi; fi`\"; export AS; CC=\"` if [ -f $r/gcc/xgcc ] ; then if [ -f $r/i586-cygwin32/newli! b/Makefile ] ; then case \"i586-pc-cygwin32\" in i[3456]86-*-cygwin*) echo $r/gcc/xgcc -B$r/gcc/ -B$r/i586-cygwin32/newlib/ -L$r/i586-cygwin32/winsup -idirafter $r/i586-cygwin32/newlib/targ-include -idirafter $s/winsup/include -idirafter $s/newlib/libc/include -idirafter $s/newlib/libc/sys/cygwin -idirafter $s/newlib/libc/sys/cygwin32 -nostdinc; ;; *) echo $r/gcc/xgcc -B$r/gcc/ -idirafter $r/i586-cygwin32/newlib/targ-include -idirafter $s/newlib/libc/include -nostdinc; ;; esac else echo $r/gcc/xgcc -B$r/g cc/; fi; else if [ \"i386-unknown-freebsd2.1.7\"= \"i586-pc-cygwin32\" ] ; then echo gcc; else t='-e s,^,i586-cygwin32-, '; echo gcc | sed -e 's/x/x/' $t; fi; fi`\"; export CC; CFLAGS=\"-g -O2\"; export CFLAGS; CXX=\"` if [ -f $r/gcc/xgcc ] ; then if [ -f $r/i586-cygwin32/newlib/Makefile ] ; then case \"i586-pc-cygwin32\" in i[3456]86-*-cygwin*) echo $r/gcc/xgcc -B$r/gcc/ -B$r/i586-cygwin32/newlib/ -L$r/i586-cygwin32/winsup -idirafter $r/i586-cygwin32/newlib/targ-include ! -idirafter $s/winsup/include -idirafter $s/newlib/libc/include -idirafter $s/newlib/libc/sys/cygwin -idirafter $s/newlib/libc/sys/cygwin32 -nostdinc; ;; *) echo $r/gcc/xgcc -B$r/gcc/ -idirafter $r/i586-cygwin32/newlib/targ-include -idirafter $s/newlib/libc/include -nostdinc; ;; esac else echo $r/gcc/xgcc -B$r/gcc/; fi; else if [ \"i386-unknown-freebsd2.1.7\" = \"i586-pc-cygwin32\" ] ; then echo c++; else t='-e s,^,i586-cygwin32-, '; echo c++ | sed -e 's/x/x/' $t; fi; fi`\"; export CXX; CXXFLAGS=\"-g -O2\ "; export CXXFLAGS; DLLTOOL=\"` if [ -f $r/binutils/dlltool ] ; then echo $r/binutils/dlltool ; else if [ \"i386-unknown-freebsd2.1.7\" = \"i586-pc-cygwin32\" ] ; then echo dlltool; else t='-e s,^,i586-cygwin32-, '; echo dlltool | sed -e 's/x/x/' $t ; fi; fi`\"; export DLLTOOL; LD=\"` if [ -f $r/ld/ld-new ] ; then echo $r/ld/ld-new ; else if [ \"i386-unknown-freebsd2.1.7\" = \"i586-pc-cygwin32\" ] ; then echo ld; else t='-e s,^,i586-cygwin32-, '; echo ld | sed -e 's/x/x/' $! t ; fi; fi`\"; export LD; LDFLAGS=\"\"; export LDFLAGS; NM=\"` if [ -f $r/binutils/nm-new ] ; then echo $r/binutils/nm-new ; else if [ \"i386-unknown-freebsd2.1.7\" = \"i586-pc-cygwin32\" ] ; then echo nm; else t='-e s,^,i586-cygwin32-, '; echo nm | sed -e 's/x/x/' $t ; fi; fi`\"; export NM; RANLIB=\"` if [ -f $r/binutils/ranlib ] ; then echo $r/binutils/ranlib ; else if [ \"i386-unknown-freebsd2.1.7\" = \"i586-pc-cygwin32\" ] ; then echo ranlib; else t='-e s,^,i586-cygwin32-, '; echo ranlib | sed -e 's /x/x/' $t ; fi; fi`\"; export RANLIB; WINDRES=\"` if [ -f $r/binutils/windres ] ; then echo $r/binutils/windres ; else if [ \"i386-unknown-freebsd2.1.7\" = \"i586-pc-cygwin32\" ] ; then echo windres; else t='-e s,^,i586-cygwin32-, '; echo windres | sed -e 's/x/x/' $t ; fi; fi`\"; export WINDRES; echo Configuring in i586-cygwin32/${dir}; cd i586-cygwin32/${dir}; case .. in /*) topdir=.. ;; *) case \"i586-cygwin32\" in .) topdir=\"../..\" ;; *) topdir=\"../../..\" ;; ! esac ;; esac; if [ \"..\" = \".\" ] ; then if [ \"i586-cygwin32\" != \".\" ] ; then if /bin/sh $s/symlink-tree ${topdir}/${dir} \"no-such-file\" ; then if [ -f Makefile ]; then if gmake distclean; then true; else exit 1; fi; else true; fi; else exit 1; fi; else true; fi; srcdiroption=\"--srcdir=.\"; libsrcdir=\".\"; else srcdiroption=\"--srcdir=${topdir}/${dir}\"; libsrcdir=\"$s/${dir}\"; fi; if [ -f ${libsrcdir}/configure ] ; then /bin/sh ${libsrcdir}/configure --host=i586-cy gwin32 --build=i386-unknown-freebsd2.1.7 --with-newlib --enable-multilib --with-cross-host=i386-unknown-freebsd2.1.7 --prefix=/usr/local/gnu-win32 ${srcdiroption} --with-target-subdir=\"i586-cygwin32\"; else /bin/sh $s/configure --host=i586-cygwin32 --build=i386-unknown-freebsd2.1.7 --with-newlib --enable-multilib --with-cross-host=i386-unknown-freebsd2.1.7 --prefix=/usr/local/gnu-win32 ${srcdiroption} --with-target-subdir=\"i586-cygwin32\"; fi; else true; ! fi; else true; fi", (char *)NULL); X} END-of-kill11.c echo x - 0parser228 sed 's/^X//' >0parser228 << 'END-of-0parser228' XIndex: parser.c X=================================================================== XRCS file: /home/cvs/cvs/src/bin/sh/parser.c,v Xretrieving revision 1.16.2.2 Xdiff -u -r1.16.2.2 parser.c X--- parser.c 1998/11/03 15:57:36 1.16.2.2 X+++ parser.c 1999/07/03 13:26:28 X@@ -942,36 +940,27 @@ X USTPUTC('\\', out); X if (SQSYNTAX[c] == CCTL) X USTPUTC(CTLESC, out); X- else if (eofmark == NULL) X- USTPUTC(CTLQUOTEMARK, out); X USTPUTC(c, out); X quotef++; X } X break; X case CSQUOTE: X- if (eofmark == NULL) X- USTPUTC(CTLQUOTEMARK, out); X syntax = SQSYNTAX; X break; X case CDQUOTE: X- if (eofmark == NULL) X- USTPUTC(CTLQUOTEMARK, out); X syntax = DQSYNTAX; X dblquote = 1; X break; X case CENDQUOTE: X- if (eofmark != NULL && arinest == 0 && X- varnest == 0) { X+ if (eofmark) { X USTPUTC(c, out); X } else { X- if (arinest) { X+ if (arinest) X syntax = ARISYNTAX; X- dblquote = 0; X- } else if (eofmark == NULL) { X+ else X syntax = BASESYNTAX; X- dblquote = 0; X- } X quotef++; X+ dblquote = 0; X } X break; X case CVAR: /* '$' */ X@@ -998,10 +987,6 @@ X if (--arinest == 0) { X USTPUTC(CTLENDARI, out); X syntax = prevsyntax; X- if (syntax == DQSYNTAX) X- dblquote = 1; X- else X- dblquote = 0; X } else X USTPUTC(')', out); X } else { X@@ -1414,10 +1399,6 @@ X prevsyntax = syntax; X syntax = ARISYNTAX; X USTPUTC(CTLARI, out); X- if (dblquote) X- USTPUTC('"',out); X- else X- USTPUTC(' ',out); X } else { X /* X * we collapse embedded arithmetic expansion to X@@ -1453,8 +1434,6 @@ X X p = text; X while ((c = *p++) != '\0') { X- if ( c == CTLQUOTEMARK) X- continue; X if (c == CTLESC) X p++; X else if (BASESYNTAX[c] == CCTL) END-of-0parser228 echo c - work mkdir -p work > /dev/null 2>&1 echo c - work/gnu-win32 mkdir -p work/gnu-win32 > /dev/null 2>&1 echo c - work/gnu-win32/src mkdir -p work/gnu-win32/src > /dev/null 2>&1 echo c - work/gnu-win32/src/CROSS mkdir -p work/gnu-win32/src/CROSS > /dev/null 2>&1 echo c - work/gnu-win32/src/CROSS/i586-cygwin32 mkdir -p work/gnu-win32/src/CROSS/i586-cygwin32 > /dev/null 2>&1 echo c - work/gnu-win32/src/CROSS/i586-cygwin32/libstdc++ mkdir -p work/gnu-win32/src/CROSS/i586-cygwin32/libstdc++ > /dev/null 2>&1 echo c - work/gnu-win32/src/CROSS/i586-cygwin32/newlib mkdir -p work/gnu-win32/src/CROSS/i586-cygwin32/newlib > /dev/null 2>&1 echo x - work/gnu-win32/src/CROSS/i586-cygwin32/newlib/Makefile sed 's/^X//' >work/gnu-win32/src/CROSS/i586-cygwin32/newlib/Makefile << 'END-of-work/gnu-win32/src/CROSS/i586-cygwin32/newlib/Makefile' END-of-work/gnu-win32/src/CROSS/i586-cygwin32/newlib/Makefile echo c - work/gnu-win32/src/CROSS/binutils mkdir -p work/gnu-win32/src/CROSS/binutils > /dev/null 2>&1 echo x - work/gnu-win32/src/CROSS/binutils/ar sed 's/^X//' >work/gnu-win32/src/CROSS/binutils/ar << 'END-of-work/gnu-win32/src/CROSS/binutils/ar' END-of-work/gnu-win32/src/CROSS/binutils/ar echo c - work/gnu-win32/src/CROSS/gas mkdir -p work/gnu-win32/src/CROSS/gas > /dev/null 2>&1 echo x - work/gnu-win32/src/CROSS/gas/as-new sed 's/^X//' >work/gnu-win32/src/CROSS/gas/as-new << 'END-of-work/gnu-win32/src/CROSS/gas/as-new' END-of-work/gnu-win32/src/CROSS/gas/as-new echo c - work/gnu-win32/src/CROSS/gcc mkdir -p work/gnu-win32/src/CROSS/gcc > /dev/null 2>&1 echo x - work/gnu-win32/src/CROSS/gcc/xgcc sed 's/^X//' >work/gnu-win32/src/CROSS/gcc/xgcc << 'END-of-work/gnu-win32/src/CROSS/gcc/xgcc' END-of-work/gnu-win32/src/CROSS/gcc/xgcc echo c - work/gnu-win32/src/libstdc++ mkdir -p work/gnu-win32/src/libstdc++ > /dev/null 2>&1 exit -- Juergen Lock <nox.foo@jelal.kn-bremen.de> (remove dot foo from address to reply) To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199907041110.EAA69488>