Patch "seccomp: fix the usage of get/put_seccomp_filter() in seccomp_get_filter()" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
seccomp: fix the usage of get/put_seccomp_filter() in seccomp_get_filter()
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
seccomp-fix-the-usage-of-get-put_seccomp_filter-in-seccomp_get_filter.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
66a733ea6b611aecf0119514d2dddab5f9d6c01eMon Sep 17 00:00:00 2001
From: Oleg Nesterov <[email protected]>
Date: Wed, 27 Sep 2017 09:25:30 -0600
Subject: seccomp: fix the usage of get/put_seccomp_filter() in seccomp_get_filter()
From: Oleg Nesterov <[email protected]>
commit 66a733ea6b611aecf0119514d2dddab5f9d6c01e upstream.
As Chris explains, get_seccomp_filter() and put_seccomp_filter() can end up using different filters. Once we drop ->siglock it is possible for task->seccomp.filter to have been replaced by SECCOMP_FILTER_FLAG_TSYNC.
--- kernel/seccomp.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-)
kernel/seccomp.c +16 -7
@@ -457,14 +457,19 @@ static long seccomp_attach_filter(unsignreturn 0 ; } +void __get_seccomp_filter (struct seccomp_filter *filter) +{ +/* Reference count is bounded by the number of total processes. */ +atomic_inc (&filter->usage); +} +/* get_seccomp_filter - increments the reference count of the filter on @tsk */ void get_seccomp_filter (struct task_struct *tsk) {struct seccomp_filter *orig = tsk->seccomp.filter;if (!orig)return ; -/* Reference count is bounded by the number of total processes. */ -atomic_inc (&orig->usage); +__get_seccomp_filter (orig); }static inline void seccomp_filter_free (struct seccomp_filter *filter)
@@ -475,10 +480,8 @@ static inline void seccomp_filter_free(s } } -/* put_seccomp_filter - decrements the ref count of tsk->seccomp.filter */ -void put_seccomp_filter (struct task_struct *tsk) +static void __put_seccomp_filter (struct seccomp_filter *orig) { -struct seccomp_filter *orig = tsk->seccomp.filter;/* Clean up single-reference branches iteratively. */ while (orig &&atomic_dec_and_test (&orig->usage)) {struct seccomp_filter *freeme = orig;
@@ -487,6 +490,12 @@ void put_seccomp_filter(struct task_stru } } +/* put_seccomp_filter - decrements the ref count of tsk->seccomp.filter */ +void put_seccomp_filter (struct task_struct *tsk) +{ +__put_seccomp_filter (tsk->seccomp.filter); +} +/** * seccomp_send_sigsys - signals the task to allow in-process syscall emulation * @syscall: syscall number to send to userland
@@ -927,13 +936,13 @@ long seccomp_get_filter(struct task_struif (!data) goto out; -get_seccomp_filter (task); +__get_seccomp_filter (filter);spin_unlock_irq (&task->sighand->siglock);if (copy_to_user (data, fprog->filter,bpf_classic_proglen (fprog))) ret = -EFAULT ; -put_seccomp_filter (task); +__put_seccomp_filter (filter);return ret; out:
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/seccomp-fix-the-usage-of-get-put_seccomp_filter-in-seccomp_get_filter.patch