From 91210cbb4960dc66605ee5bb0d7939c3d85c149d Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Wed, 17 Jan 2018 12:32:11 +0000 Subject: [PATCH] lib/osutil: Check PGID before trying to set it (fixes #4679) Fixes "permission denied" return when are already process group / session leader. GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/4678 --- lib/osutil/lowprio_linux.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/osutil/lowprio_linux.go b/lib/osutil/lowprio_linux.go index c3b6ab48..f0e83542 100644 --- a/lib/osutil/lowprio_linux.go +++ b/lib/osutil/lowprio_linux.go @@ -7,6 +7,7 @@ package osutil import ( + "os" "syscall" "github.com/pkg/errors" @@ -44,8 +45,15 @@ func SetLowPriority() error { // Move ourselves to a new process group so that we can use the process // group variants of Setpriority etc to affect all of our threads in one // go. If this fails, bail, so that we don't affect things we shouldn't. - if err := syscall.Setpgid(0, 0); err != nil { - return errors.Wrap(err, "set process group") + // If we are already the leader of our own process group, do nothing. + if pgid, err := syscall.Getpgid(0); err != nil { + // This error really shouldn't happen + return errors.Wrap(err, "get process group") + } else if pgid != os.Getpid() { + // We are not process group leader. Elevate! + if err := syscall.Setpgid(0, 0); err != nil { + return errors.Wrap(err, "set process group") + } } // Process zero is "self", niceness value 9 is something between 0