mavanamm@pttesac.UUCP (Marnix van Ammers) (10/18/89)
My ksh88b was dumping core on my SUN 3/50. It would happen whenever the first command I executed was a particular function in my $FPATH. I traced it down to the first echo command in my function. When I recompiled ksh88b with ECHOPRINT set to 1 in the OPTIONS file, the core dumps stopped. I found out that when the core dump happened, the call to path_absolute() at line 1084 of sh/name.c returned a NULL pointer and that NULL pointer was then passed to strcmp() at line 1086. The strcmp() function in SUN OS 4.0.3 apparently cannot take a NULL argument (maybe this is really something SUN ought to fix?). I could not figure out why path_absolute was returning a NULL pointer. When I used the dbxtool debugger I'd end up getting a "Trace/BPT trap(coredump)" before getting to where my normal core dump was occurring. I don't know what a "Trace/BPT trap(coredump)" (BPT == Break Point Trap ??) is but it seems to be a feature or problem with the debugger (I'm new at this dbx stuff, so forgive me). I was able to at least fix the problem by not passing a NULL pointer to strcmp(). Here are the diffs to my fix (to sh/name.c): 1085a1086,1104 > > /* Core dumping fix > > By: Marnix A. van Ammers > Oct 12, 1989 > {att|pacbell}!pttesac!mavanamm > > Following fix added to avoid core dump by eq() when cp is NULL. > (Happens when path_absolute() in echo_mode() returns NULL.) > That situation happened when the first command to use echo was in my > function gp() and OPTIONS had ECHOPRINT=0 and there is a > /bin/echo as in the case of my Sun 3/50 running SUNOS 4.0.3 */ > > if(cp == NULL) > echo_arg = (char *) e_minus; > else > > /* end of core dumping fix. */ > For your information, here's my autoload function gp (I've since changed this function, but this is the version that caused ksh88b to dump core in my SUN): ################################################################# function getpaths { if [ "$1" = -x ];then set -x;shift fi # getpaths($PATH) -- Return list of paths in $1 typeset PATH="$1" typeset This_Path Front_Part Paths while [ -n "${PATH}" ];do # While there's something in $PATH Front_Part="${PATH%%:*}" # Remove 1st ':' and all to the right of it if [ -z "$Front_Part" ];then # Front part was null -- special case This_Path="." Front_Part=":" else This_Path="$Front_Part" fi Paths="$Paths $This_Path" PATH="${PATH#${Front_Part}}" if [ "${PATH}" != ":" ];then # If this isn't the last (trailing) ':' PATH="${PATH#:}" # then remove the leading ':' fi done echo "$Paths" } # gp = getpath . Finds a *command* and does an ls -l on it # For instance "gp sh" should find sh, rsh, ksh, rksh function gp { if [ "$1" = -x ];then set -x;shift fi typeset F Files PATHS P print "Searching for executables \"*$1*\" in \$PATH" >&2 PATHS=`getpaths "$PATH"` for P in $PATHS;do for F in $P/*$1*;do if [ -f "$F" -a -x "$F" ];then Files="$Files $F" fi done done if [ -n "$Files" ];then ls -ld $Files fi } ################################################################# I don't seem to have the real problem in hand, but I did just want to report this to the net in case anyone has an idea what's really going on. -- Marnix