diff --git a/[refs] b/[refs] index 7f5d8e219cb6..6c7bb7bb11ad 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a0b0f58cdd32ab363a600a294ddaa90f0c32de8c +refs/heads/master: 33dd94ae1ccbfb7bf0fb6c692bc3d1c4269e6177 diff --git a/trunk/kernel/exit.c b/trunk/kernel/exit.c index 21aa7b3001fb..676149a4ac5f 100644 --- a/trunk/kernel/exit.c +++ b/trunk/kernel/exit.c @@ -914,6 +914,15 @@ NORET_TYPE void do_exit(long code) if (unlikely(!tsk->pid)) panic("Attempted to kill the idle task!"); + /* + * If do_exit is called because this processes oopsed, it's possible + * that get_fs() was left as KERNEL_DS, so reset it to USER_DS before + * continuing. Amongst other possible reasons, this is to prevent + * mm_release()->clear_child_tid() from writing to a user-controlled + * kernel address. + */ + set_fs(USER_DS); + tracehook_report_exit(&code); validate_creds_for_do_exit(tsk);