Re: KASAN: use-after-free Read in task_is_descendant
From: Oleg Nesterov <oleg@redhat.com>
Date: 2018-10-26 15:22:14
Also in:
lkml
On 10/27, Tetsuo Handa wrote:
On 2018/10/26 23:39, Oleg Nesterov wrote:quoted
On 10/26, Tetsuo Handa wrote:quoted
Suppose p1 == p2->real_parent and p2 == p3->real_parent, and p1 exited when someone tried to attach on p2, p2->real_parent was pointing to already (or about to be) freed p1.I don't see a difference. If p1 exits it will re-parent p2, p2->real_parent will be updated.quoted
So, the puzzle part is why p2->real_parent was still pointing p1 even after p1 was freed...I don't understand the question. Once again. TASK->real_parent can point to the freed mem only if a) TASK exits, and b) _after_ that its parent TASK->real_parent exits too.Oh, p2 exited and then p1 also exited when someone tried to attach on p2. Then, p2->real_parent can point to already (or about to be) freed p1.
Then we must see pid_alive(p2) == F as I already explained you in my yesterday's email. Because if p1 exits _after_ p2, then pid_alive(p2) == F must be already completed, p1 can't exit (I mean, release_task(p1) can't be called) until release_task(p2) does detach_pid() and drops tasklist_lock.
(By the way, if p->real_parent were updated to point to init_task when p exits, we could omit pid_alive() check?)
Sorry, I don't understand the question... Ignoring the PR_SET_CHILD_SUBREAPER parents, ignoring the exiting sub-threads which reparent to group leader, ->real_parent is alwasy updated to point to init_task. But I don't see why we could omit pid_alive() check. Oleg.