summaryrefslogtreecommitdiff
path: root/usr/src/lib/libshell/common/sh/fault.c
diff options
context:
space:
mode:
authorRoger A. Faulkner <Roger.Faulkner@Oracle.COM>2010-04-03 09:48:44 -0700
committerRoger A. Faulkner <Roger.Faulkner@Oracle.COM>2010-04-03 09:48:44 -0700
commit3e14f97f673e8a630f076077de35afdd43dc1587 (patch)
tree9828b6b676f58d7b27dd28e00202d3f3461a5cd8 /usr/src/lib/libshell/common/sh/fault.c
parent4f60987df4dcaa54a88b596f861fbf4f3382c65e (diff)
downloadillumos-gate-3e14f97f673e8a630f076077de35afdd43dc1587.tar.gz
6939349 RFE: Update ksh93 to ast-ksh.2010-03-09
6877392 ksh93 regresses 'uniq -c' performance 6887363 Korn shell 93 sometimes mishandles return value of its child process 6900314 (while true ; do true|true ; done) hang in ioctl() with SIGTTOU 6904557 wc no longer counts number of bytes correctly 6904575 cut -d with multibyte character no longer works 6904597 paste -d no longer works with multibyte characters 6904780 /usr/bin/cksum changed output in snv_128 6904870 uniq -s does not skip multibyte characters correctly 6904878 join -t no longer works with multibyte char separator 6907460 EXIT trap handlers are sometimes executed twice 6909579 libast getopt solaris compatibility broken 6920072 ksh93 tail -f, with unconditional .25s sleep and line parsing, about 37x slower than cat 6932124 mktemp in ksh93 is broken Contributed by Olga Kryzhanovska <olga.kryzhanovska@gmail.com>
Diffstat (limited to 'usr/src/lib/libshell/common/sh/fault.c')
-rw-r--r--usr/src/lib/libshell/common/sh/fault.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/usr/src/lib/libshell/common/sh/fault.c b/usr/src/lib/libshell/common/sh/fault.c
index fc90ad573e..e7bb6f9fad 100644
--- a/usr/src/lib/libshell/common/sh/fault.c
+++ b/usr/src/lib/libshell/common/sh/fault.c
@@ -1,7 +1,7 @@
/***********************************************************************
* *
* This software is part of the ast package *
-* Copyright (c) 1982-2009 AT&T Intellectual Property *
+* Copyright (c) 1982-2010 AT&T Intellectual Property *
* and is licensed under the *
* Common Public License, Version 1.0 *
* by AT&T Intellectual Property *
@@ -362,7 +362,8 @@ void sh_sigclear(register int sig)
flag &= ~(SH_SIGTRAP|SH_SIGSET);
if(trap=sh.st.trapcom[sig])
{
- free(trap);
+ if(!sh.subshell)
+ free(trap);
sh.st.trapcom[sig]=0;
}
sh.sigflag[sig] = flag;
@@ -404,11 +405,13 @@ void sh_chktrap(void)
#ifdef SHOPT_BGX
if((sh.sigflag[SIGCHLD]&SH_SIGTRAP) && sh.st.trapcom[SIGCHLD])
job_chldtrap(&sh,sh.st.trapcom[SIGCHLD],1);
- while(--sig>=0 && sig!=SIGCHLD)
-#else
- while(--sig>=0)
#endif /* SHOPT_BGX */
+ while(--sig>=0)
{
+#ifdef SHOPT_BGX
+ if(sig==SIGCHLD)
+ continue;
+#endif /* SHOPT_BGX */
if(sh.sigflag[sig]&SH_SIGTRAP)
{
sh.sigflag[sig] &= ~SH_SIGTRAP;
@@ -437,9 +440,11 @@ int sh_trap(const char *trap, int mode)
int was_verbose = sh_isstate(SH_VERBOSE);
int staktop = staktell();
char *savptr = stakfreeze(0);
+ char ifstable[256];
struct checkpt buff;
Fcin_t savefc;
fcsave(&savefc);
+ memcpy(ifstable,shp->ifstable,sizeof(ifstable));
sh_offstate(SH_HISTORY);
sh_offstate(SH_VERBOSE);
shp->intrap++;
@@ -477,6 +482,7 @@ int sh_trap(const char *trap, int mode)
shp->exitval=savxit;
stakset(savptr,staktop);
fcrestore(&savefc);
+ memcpy(shp->ifstable,ifstable,sizeof(ifstable));
if(was_history)
sh_onstate(SH_HISTORY);
if(was_verbose)