ksh/ksh-20101201-filerace.patch

35 lines
1.6 KiB
Diff
Raw Normal View History

2010-12-06 15:10:55 +00:00
diff -up ksh-20101201/src/cmd/ksh93/include/defs.h.filerace ksh-20101201/src/cmd/ksh93/include/defs.h
--- ksh-20101201/src/cmd/ksh93/include/defs.h.filerace 2010-11-03 21:04:52.000000000 +0100
+++ ksh-20101201/src/cmd/ksh93/include/defs.h 2010-12-06 16:09:05.823823786 +0100
@@ -162,6 +162,7 @@ struct shared
Namval_t *last_table; /* last table used in last nv_open */ \
Namval_t *prev_table; /* previous table used in nv_open */ \
Sfio_t *outpool; /* ouput stream pool */ \
+ pid_t outpipepid; \
long timeout; /* read timeout */ \
short curenv; /* current subshell number */ \
short jobenv; /* subshell number for jobs */ \
diff -up ksh-20101201/src/cmd/ksh93/sh/io.c.filerace ksh-20101201/src/cmd/ksh93/sh/io.c
--- ksh-20101201/src/cmd/ksh93/sh/io.c.filerace 2010-12-02 16:39:41.000000000 +0100
+++ ksh-20101201/src/cmd/ksh93/sh/io.c 2010-12-06 16:07:57.424149190 +0100
@@ -1418,7 +1418,7 @@ int sh_redirect(Shell_t *shp,struct iono
}
if(!np)
{
- if(flag==0 || tname)
+ if(flag==0 || tname || (flag==1 && fn==1 && (shp->fdstatus[fn]&IONOSEEK) && shp->outpipepid && shp->outpipepid==getpid()))
{
if(fd==fn)
{
diff -up ksh-20101201/src/cmd/ksh93/sh/xec.c.filerace ksh-20101201/src/cmd/ksh93/sh/xec.c
--- ksh-20101201/src/cmd/ksh93/sh/xec.c.filerace 2010-12-02 21:56:45.000000000 +0100
+++ ksh-20101201/src/cmd/ksh93/sh/xec.c 2010-12-06 16:09:54.632932987 +0100
@@ -2947,6 +2947,7 @@ pid_t _sh_fork(Shell_t *shp,register pid
#if !_std_malloc
vmtrace(-1);
#endif
+ shp->outpipepid = ((flags&FPOU)?getpid():0);
/* This is the child process */
if(shp->trapnote&SH_SIGTERM)
sh_exit(SH_EXITSIG|SIGTERM);