mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-25 05:10:28 +02:00
18264: free job table entries properly in subshell
This commit is contained in:
parent
4e6c75fa78
commit
ee7bdbf85d
2 changed files with 40 additions and 27 deletions
62
Src/jobs.c
62
Src/jobs.c
|
|
@ -789,30 +789,28 @@ deletefilelist(LinkList file_list)
|
|||
|
||||
/**/
|
||||
void
|
||||
deletejob(Job jn)
|
||||
freejob(Job jn, int deleting)
|
||||
{
|
||||
struct process *pn, *nx;
|
||||
|
||||
if (jn->stat & STAT_ATTACH) {
|
||||
attachtty(mypgrp);
|
||||
adjustwinsize(0);
|
||||
}
|
||||
|
||||
pn = jn->procs;
|
||||
jn->procs = NULL;
|
||||
for (; pn; pn = nx) {
|
||||
nx = pn->next;
|
||||
zfree(pn, sizeof(struct process));
|
||||
}
|
||||
deletefilelist(jn->filelist);
|
||||
|
||||
if (jn->ty)
|
||||
zfree(jn->ty, sizeof(struct ttyinfo));
|
||||
if (jn->pwd)
|
||||
zsfree(jn->pwd);
|
||||
jn->pwd = NULL;
|
||||
if (jn->stat & STAT_WASSUPER)
|
||||
deletejob(jobtab + jn->other);
|
||||
if (jn->stat & STAT_WASSUPER) {
|
||||
if (deleting)
|
||||
deletejob(jobtab + jn->other);
|
||||
else
|
||||
freejob(jobtab + jn->other, 0);
|
||||
}
|
||||
jn->gleader = jn->other = 0;
|
||||
jn->stat = jn->stty_in_env = 0;
|
||||
jn->procs = NULL;
|
||||
|
|
@ -820,6 +818,24 @@ deletejob(Job jn)
|
|||
jn->ty = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* We are actually finished with this job, rather
|
||||
* than freeing it to make space.
|
||||
*/
|
||||
|
||||
/**/
|
||||
void
|
||||
deletejob(Job jn)
|
||||
{
|
||||
deletefilelist(jn->filelist);
|
||||
if (jn->stat & STAT_ATTACH) {
|
||||
attachtty(mypgrp);
|
||||
adjustwinsize(0);
|
||||
}
|
||||
|
||||
freejob(jn, 1);
|
||||
}
|
||||
|
||||
/* add a process to the current job */
|
||||
|
||||
/**/
|
||||
|
|
@ -975,24 +991,16 @@ clearjobtab(int monitor)
|
|||
int i;
|
||||
|
||||
for (i = 1; i < MAXJOB; i++) {
|
||||
if (jobtab[i].ty) {
|
||||
zfree(jobtab[i].ty, sizeof(struct ttyinfo));
|
||||
jobtab[i].ty = NULL;
|
||||
}
|
||||
if (jobtab[i].pwd) {
|
||||
zsfree(jobtab[i].pwd);
|
||||
jobtab[i].pwd = NULL;
|
||||
}
|
||||
if (monitor) {
|
||||
/*
|
||||
* See if there is a jobtable worth saving.
|
||||
* We never free the saved version; it only happens
|
||||
* once for each subshell of a shell with job control,
|
||||
* so doesn't create a leak.
|
||||
*/
|
||||
if (jobtab[i].stat)
|
||||
oldmaxjob = i+1;
|
||||
}
|
||||
/*
|
||||
* See if there is a jobtable worth saving.
|
||||
* We never free the saved version; it only happens
|
||||
* once for each subshell of a shell with job control,
|
||||
* so doesn't create a leak.
|
||||
*/
|
||||
if (monitor && jobtab[i].stat)
|
||||
oldmaxjob = i+1;
|
||||
else if (jobtab[i].stat & STAT_INUSE)
|
||||
freejob(jobtab + i, 0);
|
||||
}
|
||||
|
||||
if (monitor && oldmaxjob) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue