mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-02-15 04:32:24 +00:00
Fix a crash when 'kill %%' and 'kill %+' are run (#35)
Ksh was trying to use the 'pw' variable as a valid pointer even
when it was NULL. This is fixed by doing the error check for
'pw' before doing anything else in 'job_kill'.
This bugfix is from Red Hat:
44e0a643a9/f/SOURCES/ksh-20130214-fixkill.patch
Fixes #34
This commit is contained in:
parent
3ba4900e9c
commit
ff358f3464
4 changed files with 13 additions and 3 deletions
3
NEWS
3
NEWS
|
@ -11,6 +11,9 @@ Any uppercase BUG_* names are modernish shell bug IDs.
|
|||
cmd=stop; $cmd $!
|
||||
will now work. See 'stop --man' and 'suspend --man' for more information.
|
||||
|
||||
- Fixed a bug that caused the kill and stop commands to segfault when given
|
||||
a non-existent job.
|
||||
|
||||
2020-06-20:
|
||||
|
||||
- Fixed a bug that caused setting the following variables as readonly in
|
||||
|
|
|
@ -17,4 +17,4 @@
|
|||
* David Korn <dgk@research.att.com> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#define SH_RELEASE "93u+m 2020-06-20"
|
||||
#define SH_RELEASE "93u+m 2020-06-22"
|
||||
|
|
|
@ -1111,6 +1111,8 @@ static struct process *job_bystring(register char *ajob)
|
|||
|
||||
int job_kill(register struct process *pw,register int sig)
|
||||
{
|
||||
if(!pw)
|
||||
goto error;
|
||||
Shell_t *shp = pw->p_shp;
|
||||
register pid_t pid;
|
||||
register int r;
|
||||
|
@ -1122,8 +1124,6 @@ int job_kill(register struct process *pw,register int sig)
|
|||
#endif /* SIGTSTP */
|
||||
job_lock();
|
||||
errno = ECHILD;
|
||||
if(pw==0)
|
||||
goto error;
|
||||
pid = pw->p_pid;
|
||||
#if SHOPT_COSHELL
|
||||
if(pw->p_cojob)
|
||||
|
|
|
@ -460,5 +460,12 @@ then [[ $actual == *Killed*Killed* ]] && msg='ksh killed itself' || msg='unexpec
|
|||
fi
|
||||
let "${actual##*$'\n'} > 128" || err_exit "child process signal did not cause exit status > 128"
|
||||
|
||||
# ======
|
||||
# Killing a non-existent job shouldn't cause a segfault. Note that `2> /dev/null` has no effect when
|
||||
# there is a segfault.
|
||||
$SHELL -c 'kill %% 2> /dev/null'; [[ $? == 1 ]] || err_exit $'`kill` doesn\'t handle a non-existent job correctly when passed \'%%\''
|
||||
$SHELL -c 'kill %+ 2> /dev/null'; [[ $? == 1 ]] || err_exit $'`kill` doesn\'t handle a non-existent job correctly when passed \'%+\''
|
||||
$SHELL -c 'kill %- 2> /dev/null'; [[ $? == 1 ]] || err_exit $'`kill` doesn\'t handle a non-existent job correctly when passed \'%-\''
|
||||
|
||||
# ======
|
||||
exit $((Errors<125?Errors:125))
|
||||
|
|
Loading…
Reference in a new issue