From 6d1352699e05c951ea35b78cd0d2ffa8cdfbadba Mon Sep 17 00:00:00 2001 From: Martijn Dekker Date: Wed, 27 Jan 2021 05:32:24 +0000 Subject: [PATCH] Fix locking error in spawn implementation This applies a patch from OpenSUSE. Source: https://build.opensuse.org/package/view_file/shells/ksh/ksh93-spawnlock.dif | Wed Oct 12 13:23:14 CEST 2016 - mls@suse.de | | - fix locking error in spawn implementation [bnc#988213] | new patch: ksh93-spawnlock.dif Unfortunately the bug report is not currently public: https://bugzilla.opensuse.org/show_bug.cgi?id=988213 but this one seems sensible enough and is in production use, so I'll take it on faith. --- src/cmd/ksh93/sh/jobs.c | 4 ++++ src/cmd/ksh93/sh/xec.c | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/cmd/ksh93/sh/jobs.c b/src/cmd/ksh93/sh/jobs.c index 225bac33358e..acefa2972017 100644 --- a/src/cmd/ksh93/sh/jobs.c +++ b/src/cmd/ksh93/sh/jobs.c @@ -1947,6 +1947,10 @@ void job_fork(pid_t parent) job_lock(); jobfork++; break; + case -2: + jobfork--; + job_unlock(); + break; case 0: jobfork=0; job_unlock(); diff --git a/src/cmd/ksh93/sh/xec.c b/src/cmd/ksh93/sh/xec.c index f34fb5e1b419..9ff1b20a6d1b 100644 --- a/src/cmd/ksh93/sh/xec.c +++ b/src/cmd/ksh93/sh/xec.c @@ -3631,6 +3631,7 @@ static pid_t sh_ntfork(Shell_t *shp,const Shnode_t *t,char *argv[],int *jobid,in # endif /* !_lib_fork */ sh_pushcontext(shp,buffp,SH_JMPCMD); errorpush(&buffp->err,ERROR_SILENT); + job_lock(); /* errormsg will unlock */ jmpval = sigsetjmp(buffp->buff,0); if(jmpval == 0) { @@ -3732,7 +3733,7 @@ static pid_t sh_ntfork(Shell_t *shp,const Shnode_t *t,char *argv[],int *jobid,in } fail: if(jobfork && spawnpid<0) - job_fork(0); + job_fork(-2); if(spawnpid < 0) switch(errno=shp->path_err) { case ENOENT: @@ -3740,6 +3741,7 @@ static pid_t sh_ntfork(Shell_t *shp,const Shnode_t *t,char *argv[],int *jobid,in default: errormsg(SH_DICT,ERROR_system(ERROR_NOEXEC),e_exec+4); } + job_unlock(); } else exitset();