From: Oleg Nesterov <oleg@redhat.com>
To: Tejun Heo <tj@kernel.org>
Cc: Jan Kratochvil <jan.kratochvil@redhat.com>,
Pedro Alves <palves@redhat.com>,
Andrey Ryabinin <aryabinin@virtuozzo.com>,
Roland McGrath <roland@hack.frob.com>,
LKML <linux-kernel@vger.kernel.org>
Subject: Re: ptrace() hangs on attempt to seize/attach stopped & frozen task
Date: Tue, 17 Nov 2015 20:34:19 +0100 [thread overview]
Message-ID: <20151117193419.GA9993@redhat.com> (raw)
In-Reply-To: <20151116184516.GJ18894@mtj.duckdns.org>
On 11/16, Tejun Heo wrote:
>
> *** WARNING: THE ATTACHED DOCUMENT(S) CONTAIN MACROS ***
> *** MACROS MAY CONTAIN MALICIOUS CODE ***
> *** Open only if you can verify and trust the sender ***
> *** Please contact infosec@redhat.com if you have questions or concerns **
Hmm, infosec@redhat.com doesn't like you. But I dared to open and nothing
happened so far. although perhaps you already own my machine.
> > And perhaps we can simply remove this logic? I forgot why do we hide this
> > STOPPED -> RUNNING -> TRACED transition from the attaching thread. But the
> > vague feeling tells me that we discussed this before and perhaps it was me
> > who suggested to avoid the user-visible change when you introduced this
> > transition...
>
> Heh, it was too long ago for me to remember much. :)
Same here...
> > Anyway, now I do not understand why do we want to hide it. Lets consider
> > the following "test-case",
> >
> > void test(int pid)
> > {
> > kill(pid, SIGSTOP);
> > waitpid(pid, NULL, WSTOPPED);
> >
> > ptrace(PTRACE_ATTACH-OR-PTRACE_SEIZE, pid, 0,0);
> >
> > assert(ptrace(PTRACE_DETACH, pid, 0,0) == 0);
> > }
> >
> > Yes, it will fail if we remove JOBCTL_TRAPPING. But it can equally fail
> > if SIGCONT comes before ATTACH, so perhaps we do not really care?
> >
> > Jan, Pedro, do you think the patch below can break gdb somehow? With this
> > patch you can never assume that waitpid(WNOHANG) or ptrace(WHATEVER) will
> > succeed right after PTRACE_ATTACH/PTRACE_SEIZE, even if you know that the
> > tracee was TASK_STOPPED before attach.
> >
> > Tejun, do you see any reason to keep JOBCTL_TRAPPING?
>
> Hmmm... It's nasty tho. We're breaking a guaranteed userland behavior
Perhaps you are right, but I am wondering if it was ever guaranteed.
What actually annoys me is that now I am almost sure that it was me
who asked you to hide this from user-space, and today I see no reason
for this hack.
> I'd be a lot more comfortable stating
> that cgroup freezer is currently broken rather than diddling with
> subtle ptrace semantics.
OK, lets keep this JOBCTL_TRAPPING_BIT.
But still I would like to know what Pedro thinks...
Anyway, wait_on_bit(TASK_UNINTERRUPTIBLE) doesn't look good. Do you
see any problem with the change below? Yes, the comment is not clear,
it should be updated, the tracee can clear this bit too.
And perhaps we can change get_task_state() until freezer gets another state,
--- x/fs/proc/array.c
+++ x/fs/proc/array.c
@@ -126,6 +126,9 @@ static inline const char *get_task_state
{
unsigned int state = (tsk->state | tsk->exit_state) & TASK_REPORT;
+ if (tsk->flags & PF_FROZEN)
+ return "D (frozen)";
+
BUILD_BUG_ON(1 + ilog2(TASK_REPORT) != ARRAY_SIZE(task_state_array)-1);
return task_state_array[fls(state)];
?
Oleg.
--- x/kernel/ptrace.c
+++ x/kernel/ptrace.c
@@ -364,8 +364,13 @@ unlock_creds:
mutex_unlock(&task->signal->cred_guard_mutex);
out:
if (!retval) {
- wait_on_bit(&task->jobctl, JOBCTL_TRAPPING_BIT,
- TASK_UNINTERRUPTIBLE);
+ if (wait_on_bit(&task->jobctl, JOBCTL_TRAPPING_BIT,
+ TASK_KILLABLE))
+ /*
+ * We will clear JOBCTL_TRAPPING in __ptrace_unlink(),
+ * until then nobody can trace this task anyway.
+ */
+ retval = -EINTR;
proc_ptrace_connector(task, PTRACE_ATTACH);
}
next prev parent reply other threads:[~2015-11-17 18:38 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-09 15:12 ptrace() hangs on attempt to seize/attach stopped & frozen task Andrey Ryabinin
2015-11-09 18:55 ` Oleg Nesterov
2015-11-09 18:02 ` Tejun Heo
2015-11-10 20:20 ` Oleg Nesterov
2015-11-16 18:45 ` Tejun Heo
2015-11-17 19:34 ` Oleg Nesterov [this message]
2015-11-17 18:57 ` Tejun Heo
2015-11-19 16:49 ` Pedro Alves
2015-11-19 17:47 ` Oleg Nesterov
2015-11-19 18:08 ` Pedro Alves
2015-11-10 20:20 ` Oleg Nesterov
2015-11-19 18:47 ` [PATCH 0/2] (Was: ptrace() hangs on attempt to seize/attach stopped & frozen task) Oleg Nesterov
2015-11-19 18:47 ` [PATCH 1/2] ptrace: make wait_on_bit(JOBCTL_TRAPPING_BIT) in ptrace_attach() killable Oleg Nesterov
2015-11-23 23:05 ` Tejun Heo
2015-11-19 18:47 ` [PATCH 2/2] ptrace: task_stopped_code(ptrace => true) can't see TASK_STOPPED task Oleg Nesterov
2015-11-23 23:15 ` Tejun Heo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20151117193419.GA9993@redhat.com \
--to=oleg@redhat.com \
--cc=aryabinin@virtuozzo.com \
--cc=jan.kratochvil@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=palves@redhat.com \
--cc=roland@hack.frob.com \
--cc=tj@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox