libposix: fix setpgid: if the target process is already a group leader, do nothing

This commit is contained in:
Giacomo Tesio 2017-12-25 13:13:09 +01:00
parent 6a9aaa3b14
commit 8ed3e74c3f
2 changed files with 10 additions and 2 deletions

View File

@ -49,12 +49,14 @@ __libposix_sighelper_set_pgid(int target, int group)
long raw;
} offset;
IntBuf buf;
long ret;
offset.request.command = PHSetProcessGroup;
offset.request.target = target;
buf.group = group;
return pwrite(*__libposix_devsignal, buf.raw, sizeof(buf.raw), offset.raw);
ret = pwrite(*__libposix_devsignal, buf.raw, sizeof(buf.raw), offset.raw);
return ret;
}
static int
@ -77,11 +79,15 @@ CreateNewProcessGroup:
rfork(RFNOTEG);
return __libposix_sighelper_cmd(PHSetProcessGroup, mypid);
}
if(pid == 0)
pid = mypid;
ppid = get_ppid(pid);
if(ppid == -1 || pid != mypid && mypid != ppid){
*errnop = __libposix_get_errno(PosixESRCH);
return -1;
}
if(group == 0)
group = pid;
if(pid == group && pid == mypid)
goto CreateNewProcessGroup;

View File

@ -329,8 +329,10 @@ group_create(Process *leader)
ProcessGroup* g;
assert(leader != nil);
if((leader->flags & GroupLeader) || (leader->flags & SessionLeader))
if(leader->flags & SessionLeader)
return nil; /* operation not permitted */
if(leader->group && leader->group->pgid == leader->pid)
return leader->group; /* nothing to do */
g = mallocz(sizeof(ProcessGroup), 1);
if(g == nil)