From 8ed3e74c3fa05fcbdd985fb3de59e9baee38f12f Mon Sep 17 00:00:00 2001 From: Giacomo Tesio Date: Mon, 25 Dec 2017 13:13:09 +0100 Subject: [PATCH] libposix: fix setpgid: if the target process is already a group leader, do nothing --- sys/src/lib/posix/ids.c | 8 +++++++- sys/src/lib/posix/posixly.c | 4 +++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/sys/src/lib/posix/ids.c b/sys/src/lib/posix/ids.c index 4acf1fd..749867a 100644 --- a/sys/src/lib/posix/ids.c +++ b/sys/src/lib/posix/ids.c @@ -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; diff --git a/sys/src/lib/posix/posixly.c b/sys/src/lib/posix/posixly.c index 64932a1..6d735ef 100644 --- a/sys/src/lib/posix/posixly.c +++ b/sys/src/lib/posix/posixly.c @@ -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)