Oleg modified the code that did
"mutex_lock_interruptible(&current->cred_guard_mutex)" to return
-ERESTARTNOINTR instead of -EINTR, so that userspace will never see a
failure to grab the mutex.

Slightly earlier Liam R. Howlett defined mutex_lock_killable for
exactly the same situation but it does it a little more cleanly.

Switch the code to mutex_lock_killable so that it is clearer what the
code is doing.

Ref: ad776537cc6b ("Add mutex_lock_killable")
Ref: 793285fcafce ("cred_guard_mutex: do not return -EINTR to user-space")
Signed-off-by: "Eric W. Biederman" <ebied...@xmission.com>
---
 fs/exec.c       | 5 +++--
 kernel/ptrace.c | 4 ++--
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/fs/exec.c b/fs/exec.c
index 82106241ed53..11a5c073aa35 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -1493,8 +1493,9 @@ EXPORT_SYMBOL(finalize_exec);
  */
 static int prepare_bprm_creds(struct linux_binprm *bprm)
 {
-       if (mutex_lock_interruptible(&current->signal->cred_guard_mutex))
-               return -ERESTARTNOINTR;
+       int retval = mutex_lock_killable(&current->signal->cred_guard_mutex);
+       if (retval)
+               return retval;
 
        bprm->cred = prepare_exec_creds();
        if (likely(bprm->cred))
diff --git a/kernel/ptrace.c b/kernel/ptrace.c
index 43d6179508d6..1876b3392488 100644
--- a/kernel/ptrace.c
+++ b/kernel/ptrace.c
@@ -391,8 +391,8 @@ static int ptrace_attach(struct task_struct *task, long 
request,
         * SUID, SGID and LSM creds get determined differently
         * under ptrace.
         */
-       retval = -ERESTARTNOINTR;
-       if (mutex_lock_interruptible(&task->signal->cred_guard_mutex))
+       retval = mutex_lock_killable(&task->signal->cred_guard_mutex);
+       if (retval)
                goto out;
 
        task_lock(task);
-- 
2.20.1

Reply via email to