Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8141c7f3 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Move "exit_robust_list" into mm_release()



We don't want to get rid of the futexes just at exit() time, we want to
drop them when doing an execve() too, since that gets rid of the
previous VM image too.

Doing it at mm_release() time means that we automatically always do it
when we disassociate a VM map from the task.

Reported-by: default avatar <pageexec@freemail.hu>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Nick Piggin <npiggin@suse.de>
Cc: Hugh Dickins <hugh@veritas.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Brad Spengler <spender@grsecurity.net>
Cc: Alex Efros <powerman@powerman.name>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 9c7c3546
Loading
Loading
Loading
Loading
+0 −9
Original line number Original line Diff line number Diff line
@@ -40,7 +40,6 @@
#include <linux/cn_proc.h>
#include <linux/cn_proc.h>
#include <linux/mutex.h>
#include <linux/mutex.h>
#include <linux/futex.h>
#include <linux/futex.h>
#include <linux/compat.h>
#include <linux/pipe_fs_i.h>
#include <linux/pipe_fs_i.h>
#include <linux/audit.h> /* for audit_free() */
#include <linux/audit.h> /* for audit_free() */
#include <linux/resource.h>
#include <linux/resource.h>
@@ -1059,14 +1058,6 @@ NORET_TYPE void do_exit(long code)
		exit_itimers(tsk->signal);
		exit_itimers(tsk->signal);
	}
	}
	acct_collect(code, group_dead);
	acct_collect(code, group_dead);
#ifdef CONFIG_FUTEX
	if (unlikely(tsk->robust_list))
		exit_robust_list(tsk);
#ifdef CONFIG_COMPAT
	if (unlikely(tsk->compat_robust_list))
		compat_exit_robust_list(tsk);
#endif
#endif
	if (group_dead)
	if (group_dead)
		tty_audit_exit();
		tty_audit_exit();
	if (unlikely(tsk->audit_context))
	if (unlikely(tsk->audit_context))
+11 −0
Original line number Original line Diff line number Diff line
@@ -40,6 +40,7 @@
#include <linux/jiffies.h>
#include <linux/jiffies.h>
#include <linux/tracehook.h>
#include <linux/tracehook.h>
#include <linux/futex.h>
#include <linux/futex.h>
#include <linux/compat.h>
#include <linux/task_io_accounting_ops.h>
#include <linux/task_io_accounting_ops.h>
#include <linux/rcupdate.h>
#include <linux/rcupdate.h>
#include <linux/ptrace.h>
#include <linux/ptrace.h>
@@ -519,6 +520,16 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm)
{
{
	struct completion *vfork_done = tsk->vfork_done;
	struct completion *vfork_done = tsk->vfork_done;


	/* Get rid of any futexes when releasing the mm */
#ifdef CONFIG_FUTEX
	if (unlikely(tsk->robust_list))
		exit_robust_list(tsk);
#ifdef CONFIG_COMPAT
	if (unlikely(tsk->compat_robust_list))
		compat_exit_robust_list(tsk);
#endif
#endif

	/* Get rid of any cached register state */
	/* Get rid of any cached register state */
	deactivate_mm(tsk, mm);
	deactivate_mm(tsk, mm);