All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bernd Edlinger <bernd.edlinger@hotmail.de>
To: "Eric W. Biederman" <ebiederm@xmission.com>,
	Linus Torvalds <torvalds@linux-foundation.org>
Cc: Waiman Long <longman@redhat.com>, Ingo Molnar <mingo@kernel.org>,
	Will Deacon <will@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Alexey Gladkov <gladkov.alexey@gmail.com>
Subject: Re: [GIT PULL] Please pull proc and exec work for 5.7-rc1
Date: Thu, 9 Apr 2020 17:15:07 +0200	[thread overview]
Message-ID: <AM6PR03MB5170B4DE6096F78BAB79BF72E4C10@AM6PR03MB5170.eurprd03.prod.outlook.com> (raw)
In-Reply-To: <87y2r4so3i.fsf@x220.int.ebiederm.org>

On 4/9/20 4:58 PM, Eric W. Biederman wrote:
> Linus Torvalds <torvalds@linux-foundation.org> writes:
> 
>> On Wed, Apr 8, 2020 at 8:17 AM Eric W. Biederman <ebiederm@xmission.com> wrote:
>>>
>>> Yes.  I missed the fact that we could take the lock killable.
>>> We still unfortunately have the deadlock with ptrace.
>>
>> That, I feel, is similarly trivial.
>>
>> Again, anybody who takes the lock for writing should just do so
>> killably. So you have three cases:
>>
>>  - ptrace wins the race and gets the lock.
>>
>>    Fine, the execve will wait until afterwards.
>>
>>  - ptrace loses the race and is not a thread with execve.
>>
>>    Fine, the execve() won, and the ptrace will wait until after execve.
>>
>>  - ptrace loses the race and is a thread with execve.
>>
>>    Fine, the execve() will kill the thing in dethread() and the ptrace
>> thread will release the lock and die.
> 
> That would be nice.
> 
> That is unfortunately not how ptrace_event(PTRACE_EVENT_EXIT, ...) works.
> 
> When a thread going about it's ordinary business receives the SIGKILL
> from de_thread the thread changes course and finds it's way to do_exit.
> In do_exit the thread calls ptrace_event(PTRACE_EVENT_EXIT, ...) and
> blocks waiting for the tracer to let it continue.
> 
> Further from previous attempts to fix this we know that there
> are pieces of userspace expect that stop to happen.  So if the
> PTRACE_EVENT_EXIT stop does not happen userspace which is already
> attached breaks.
> 
> Further this case with ptrace is something we know userspace
> does and is is just a matter of bad timing of attaching to the
> threads when one thread is exec'ing.  So we don't even need to wonder if
> userspace would do such a silling thing.
> 
> 
> 
> There are a lot similar cases that can happen if userspace inserts
> itself into the path of page faults, directly or indirectly,
> as long as some wait somewhere ultimately waits for a ptrace attach.
> 
> 

Remember, as a last resort there is my "insane" 15/16 patch, which
Linus admittedly hates, but it works.  If we find a cleaner solution
it can always be reverted, that is just fine for me.

Thanks
Bernd.

>> So all three cases are fine, and none of them have any behavioral
>> differences (as mentioned, the killing is "invisible" to users since
>> it's fundamentally a race, and you can consider the kill to have
>> happened before the ptrace started).
> 
> See above.
> 
> 
>>> It might be simpler to make whichever lock we are dealing with per
>>> task_struct instead of per signal_struct.  Then we don't even have to
>>> think about what de_thread does or if the lock is taken killable.
>>
>> Well, yes, but I think the dethread behavior of killing threads is
>> required anyway, so..
> 
> It is, but it is actually part of the problem.
> 
> I think making some of this thread local might solve another easy case
> and let us focus more on the really hard problem.
> 
>>> I keep wondering if we could do something similar to vfork.  That is
>>> allocate an new task_struct and fully set it up for the post exec
>>> process, and then make it visible under tasklist_lock.  Finally we could
>>> free the old process.
>>>
>>> That would appear as if everything happened atomically from
>>> the point of view of the rest of the kernel.
>>
>> I do think that would have been a lovely design originally, and would
>> avoid a lot of things. So "execve()" would basically look like an exit
>> and a thread creation with the same pid (without the SIGCHILD to the
>> parent, obviously)
>>
>> That would also naturally handle the "flush pending signals" etc issues.
>>
>> The fact that we created a whole new mm-struct ended up fixing a lot
>> of problems (even if it was painful to do). This might be similar.
>>
>> But it's not what we've ever done, and I do suspect you'd run into a
>> lot of odd small special cases if we were to try to do it now.
> 
> I completely agree, which is why I haven't been rushing to do that.
> But this remains the only idea that I have thought of that would solve all
> of the issues.
> 
>> So I think it's simpler to just start making the "cred lock waiters
>> have to be killable" rule. It's not like that's a very complex rule.
> 
> I just looked at the remaining users of cred_guard_mutex and they are
> all killable or interruptible.  Further all of the places that have been
> converted to use the exec_update_mutex are also all killable or
> interruptible.
> 
> So where we came in is that we had the killable rule and that has what
> has allowed this to remain on the backburner for so long.  At least you
> could kill the affected process from userspace.   Unfortunately the
> deadlocks still happen.
> 
> Eric
> 

  reply	other threads:[~2020-04-09 15:15 UTC|newest]

Thread overview: 127+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <87blobnq02.fsf@x220.int.ebiederm.org>
2020-04-02 19:04 ` [GIT PULL] Please pull proc and exec work for 5.7-rc1 Linus Torvalds
2020-04-02 19:31   ` Bernd Edlinger
2020-04-02 19:52     ` Linus Torvalds
2020-04-02 20:59       ` Bernd Edlinger
2020-04-02 21:46         ` Linus Torvalds
2020-04-02 23:01           ` Eric W. Biederman
2020-04-02 23:42             ` Bernd Edlinger
2020-04-02 23:45               ` Eric W. Biederman
2020-04-02 23:49                 ` Bernd Edlinger
2020-04-02 23:45               ` Linus Torvalds
2020-04-02 23:44             ` Linus Torvalds
2020-04-03  0:05               ` Eric W. Biederman
2020-04-07  1:29               ` [RFC][PATCH 0/3] exec_update_mutex related cleanups Eric W. Biederman
2020-04-07  1:31                 ` [PATCH 1/3] binfmt: Move install_exec_creds after setup_new_exec to match binfmt_elf Eric W. Biederman
2020-04-07 15:58                   ` Kees Cook
2020-04-07 16:11                   ` Christian Brauner
2020-04-08 17:25                   ` Linus Torvalds
2020-04-08 19:51                     ` Eric W. Biederman
2020-04-07  1:31                 ` [PATCH 2/3] exec: Make unlocking exec_update_mutex explict Eric W. Biederman
2020-04-07 16:02                   ` Kees Cook
2020-04-07 16:17                   ` Christian Brauner
2020-04-07 16:21                     ` Eric W. Biederman
2020-04-07  1:32                 ` [PATCH 3/3] exec: Rename the flag called_exec_mmap point_of_no_return Eric W. Biederman
2020-04-07 16:03                   ` Kees Cook
2020-04-07 16:21                   ` Christian Brauner
2020-04-07 16:22                 ` [RFC][PATCH 0/3] exec_update_mutex related cleanups Christian Brauner
2020-04-08 17:26                 ` Linus Torvalds
2020-04-03  5:09             ` [GIT PULL] Please pull proc and exec work for 5.7-rc1 Bernd Edlinger
2020-04-03 19:26             ` Linus Torvalds
2020-04-03 20:41               ` Waiman Long
2020-04-03 20:59                 ` Linus Torvalds
2020-04-03 23:16                   ` Waiman Long
2020-04-03 23:23                     ` Waiman Long
2020-04-04  1:30                       ` Linus Torvalds
2020-04-04  2:02                         ` Waiman Long
2020-04-04  2:28                           ` Linus Torvalds
2020-04-04  6:34                             ` Bernd Edlinger
2020-04-05  6:34                               ` Bernd Edlinger
2020-04-05 19:35                                 ` Linus Torvalds
2020-04-05  2:42                             ` Waiman Long
2020-04-05  3:35                               ` Bernd Edlinger
2020-04-05  3:45                                 ` Waiman Long
2020-04-06 13:13                             ` Will Deacon
2020-04-04  4:23                     ` Bernd Edlinger
2020-04-06 22:17               ` Eric W. Biederman
2020-04-07 19:50                 ` Linus Torvalds
2020-04-07 20:29                   ` Bernd Edlinger
2020-04-07 20:47                     ` Linus Torvalds
2020-04-08 15:14                   ` Eric W. Biederman
2020-04-08 15:21                     ` Bernd Edlinger
2020-04-08 16:34                     ` Linus Torvalds
2020-04-09 14:58                       ` Eric W. Biederman
2020-04-09 15:15                         ` Bernd Edlinger [this message]
2020-04-09 16:15                         ` Linus Torvalds
2020-04-09 16:24                           ` Linus Torvalds
2020-04-09 17:03                             ` Eric W. Biederman
2020-04-09 17:17                               ` Bernd Edlinger
2020-04-09 17:37                                 ` Linus Torvalds
2020-04-09 17:46                                   ` Bernd Edlinger
2020-04-09 18:36                                     ` Linus Torvalds
2020-04-09 19:42                                       ` Linus Torvalds
2020-04-09 19:57                                         ` Bernd Edlinger
2020-04-09 20:04                                           ` Linus Torvalds
2020-04-09 20:36                                             ` Bernd Edlinger
2020-04-09 21:00                                             ` Eric W. Biederman
2020-04-09 21:17                                               ` Linus Torvalds
2020-04-09 23:52                                                 ` Bernd Edlinger
2020-04-10  0:30                                                 ` Linus Torvalds
2020-04-10  0:32                                                   ` Linus Torvalds
2020-04-11  4:07                                                     ` Bernd Edlinger
2020-04-11 18:20                                                   ` Oleg Nesterov
2020-04-11 18:29                                                     ` Linus Torvalds
2020-04-11 18:31                                                       ` Linus Torvalds
2020-04-11 19:15                                                       ` Bernd Edlinger
2020-04-11 20:07                                                         ` Linus Torvalds
2020-04-11 21:16                                                           ` Bernd Edlinger
     [not found]                                                             ` <CAHk-=wgWHkBzFazWJj57emHPd3Dg9SZHaZqoO7-AD+UbBTJgig@mail.gmail.com>
2020-04-11 21:57                                                               ` Linus Torvalds
2020-04-12  6:01                                                                 ` Bernd Edlinger
2020-04-12 19:50                                                       ` Oleg Nesterov
2020-04-12 20:14                                                         ` Linus Torvalds
2020-04-28  2:56                                                           ` Bernd Edlinger
2020-04-28 17:07                                                             ` Linus Torvalds
2020-04-28 19:08                                                               ` Oleg Nesterov
2020-04-28 20:35                                                                 ` Linus Torvalds
2020-04-28 21:06                                                                   ` Jann Horn
2020-04-28 21:36                                                                     ` Linus Torvalds
2020-04-28 21:53                                                                       ` Jann Horn
2020-04-28 22:14                                                                         ` Linus Torvalds
2020-04-28 23:36                                                                           ` Jann Horn
2020-04-29 17:58                                                                             ` Linus Torvalds
2020-04-29 18:33                                                                               ` Jann Horn
2020-04-29 18:57                                                                                 ` Linus Torvalds
2020-04-29 19:23                                                                               ` Bernd Edlinger
2020-04-29 19:26                                                                                 ` Jann Horn
2020-04-29 20:19                                                                                   ` Bernd Edlinger
2020-04-29 21:06                                                                                     ` Jann Horn
2020-04-29 22:38                                                                                 ` Linus Torvalds
2020-04-29 23:22                                                                                   ` Linus Torvalds
2020-04-29 23:59                                                                                     ` Jann Horn
2020-04-30  1:08                                                                                       ` Bernd Edlinger
2020-04-30  2:20                                                                                         ` Linus Torvalds
2020-04-30  3:00                                                                                           ` Jann Horn
2020-04-30  3:25                                                                                             ` Linus Torvalds
2020-04-30  3:41                                                                                               ` Jann Horn
2020-04-30  3:50                                                                                                 ` Linus Torvalds
2020-04-30 13:37                                                                                               ` Linus Torvalds
2020-04-30  2:16                                                                                       ` Linus Torvalds
2020-04-30 13:39                                                                                         ` Bernd Edlinger
2020-04-30 13:47                                                                                           ` Linus Torvalds
2020-04-30 14:29                                                                                             ` Bernd Edlinger
2020-04-30 16:40                                                                                               ` Linus Torvalds
2020-05-02  4:11                                                                                                 ` Bernd Edlinger
2020-04-09 17:36                               ` Linus Torvalds
2020-04-09 20:34                                 ` Eric W. Biederman
2020-04-09 20:56                                   ` Linus Torvalds
2020-04-02 23:02           ` Bernd Edlinger
2020-04-02 23:22           ` Bernd Edlinger
2020-04-03  7:38           ` Bernd Edlinger
2020-04-03 16:00       ` Bernd Edlinger
2020-04-03 15:09   ` Bernd Edlinger
2020-04-03 16:23     ` Linus Torvalds
2020-04-03 16:36       ` Bernd Edlinger
2020-04-04  5:43       ` Bernd Edlinger
2020-04-04  5:48         ` Bernd Edlinger
2020-04-06  6:41           ` Bernd Edlinger
2020-04-10 13:03 ` [GIT PULL] proc fix " Eric W. Biederman
2020-04-10 20:40   ` pr-tracker-bot

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=AM6PR03MB5170B4DE6096F78BAB79BF72E4C10@AM6PR03MB5170.eurprd03.prod.outlook.com \
    --to=bernd.edlinger@hotmail.de \
    --cc=ebiederm@xmission.com \
    --cc=gladkov.alexey@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=longman@redhat.com \
    --cc=mingo@kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=will@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.