mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Fix hang in comsubs
(rhbz#1062296) (re: 970069a6
)
The new command substitution mechanism imported in970069a6
from Red Hat patches introduced this bug: backtick-style command substitutions hang when processing about 117KiB of data or more. It is fixed by another Red Hat patch:642af4d6/f/ksh-20140415-hokaido.patch
It saves the value of the shp->comsub flag so that it is set to 2 (usually meaning new-style $(comsubs)) in two specific cases even when processing backtick comsubs. This stops the sh_subtmpfile() function in subshell.c from creating a /tmp file. However, I think that approach is quite ugly, so I'm taking a slightly different one that has the same effect. src/cmd/ksh93/include/defs.h, src/cmd/ksh93/sh/subshell.c: - Redefine sh_subtmpfile() to pass the comsub flag as an argument. (Remove the shp pointer argument, which is redundant; a pointer to the shell state can easily be obtained in the function.) src/cmd/ksh93/sh/xec.c: sh_exec(): - Apply the Red Hat fix by passing flag 2 to sh_subtmpfile(). src/cmd/ksh93/tests/subshell.sh: - Move regress test fromce68e1be
from basic.sh to here; this is the place for command substitution tests as they are subshells. - Add regress test for this bug. All other changed files: - Update sh_subtmpfile() calls to pass on the shp->comsub flag.
This commit is contained in:
parent
3654ee73c0
commit
4ce486a7a4
7 changed files with 42 additions and 30 deletions
|
@ -211,7 +211,7 @@ struct shared
|
|||
unsigned char ignsig; /* ignored signal in subshell */ \
|
||||
unsigned char lastsig; /* last signal received */ \
|
||||
char pathinit; /* pathinit called from subshell */ \
|
||||
char comsub; /* set when in $() comsub */ \
|
||||
char comsub; /* set to 1 when in `` comsub, 2 when in $() comsub */ \
|
||||
char subshare; /* set when in ${..} comsub */ \
|
||||
char toomany; /* set when out of fd's */ \
|
||||
char instance; /* in set_instance */ \
|
||||
|
@ -399,7 +399,7 @@ extern Namval_t *sh_scoped(Shell_t*, Namval_t*);
|
|||
extern Dt_t *sh_subfuntree(int);
|
||||
extern void sh_subjobcheck(pid_t);
|
||||
extern int sh_subsavefd(int);
|
||||
extern void sh_subtmpfile(Shell_t*);
|
||||
extern void sh_subtmpfile(char);
|
||||
extern char *sh_substitute(const char*,const char*,char*);
|
||||
extern void sh_timetraps(Shell_t*);
|
||||
extern const char *_sh_translate(const char*);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue