posix-cpu-timers: workaround to suppress the problems with mt exec (rhbz#656264)
This commit is contained in:
parent
ab76abd31e
commit
18241e1172
@ -735,6 +735,8 @@ Patch12401: ipc-shm-fix-information-leak-to-user.patch
|
|||||||
|
|
||||||
Patch12405: inet_diag-make-sure-we-run-the-same-bytecode-we-audited.patch
|
Patch12405: inet_diag-make-sure-we-run-the-same-bytecode-we-audited.patch
|
||||||
|
|
||||||
|
Patch12406: posix-cpu-timers-workaround-to-suppress-problems-with-mt-exec.patch
|
||||||
|
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root
|
BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root
|
||||||
@ -1368,6 +1370,9 @@ ApplyPatch ipc-shm-fix-information-leak-to-user.patch
|
|||||||
# rhbz#651264 (CVE-2010-3880)
|
# rhbz#651264 (CVE-2010-3880)
|
||||||
ApplyPatch inet_diag-make-sure-we-run-the-same-bytecode-we-audited.patch
|
ApplyPatch inet_diag-make-sure-we-run-the-same-bytecode-we-audited.patch
|
||||||
|
|
||||||
|
# rhbz#656264
|
||||||
|
ApplyPatch posix-cpu-timers-workaround-to-suppress-problems-with-mt-exec.patch
|
||||||
|
|
||||||
# END OF PATCH APPLICATIONS
|
# END OF PATCH APPLICATIONS
|
||||||
|
|
||||||
%endif
|
%endif
|
||||||
@ -1985,6 +1990,8 @@ fi
|
|||||||
- zero struct memory in ipc compat (CVE-2010-4073) (#648658)
|
- zero struct memory in ipc compat (CVE-2010-4073) (#648658)
|
||||||
- zero struct memory in ipc shm (CVE-2010-4072) (#648656)
|
- zero struct memory in ipc shm (CVE-2010-4072) (#648656)
|
||||||
- fix logic error in INET_DIAG bytecode auditing (CVE-2010-3880) (#651264)
|
- fix logic error in INET_DIAG bytecode auditing (CVE-2010-3880) (#651264)
|
||||||
|
- posix-cpu-timers: workaround to suppress the problems with mt exec
|
||||||
|
(rhbz#656264)
|
||||||
|
|
||||||
* Tue Nov 23 2010 Kyle McMartin <kyle@redhat.com>
|
* Tue Nov 23 2010 Kyle McMartin <kyle@redhat.com>
|
||||||
- fix-i8k-inline-asm.patch: backport gcc miscompilation fix from git
|
- fix-i8k-inline-asm.patch: backport gcc miscompilation fix from git
|
||||||
|
@ -0,0 +1,60 @@
|
|||||||
|
From 78dfb59b62d1a7735cd28fc2783e58c122954fae Mon Sep 17 00:00:00 2001
|
||||||
|
From: Oleg Nesterov <oleg@redhat.com>
|
||||||
|
Date: Fri, 5 Nov 2010 16:53:42 +0100
|
||||||
|
Subject: posix-cpu-timers: workaround to suppress the problems with mt exec
|
||||||
|
|
||||||
|
posix-cpu-timers.c correctly assumes that the dying process does
|
||||||
|
posix_cpu_timers_exit_group() and removes all !CPUCLOCK_PERTHREAD
|
||||||
|
timers from signal->cpu_timers list.
|
||||||
|
|
||||||
|
But, it also assumes that timer->it.cpu.task is always the group
|
||||||
|
leader, and thus the dead ->task means the dead thread group.
|
||||||
|
|
||||||
|
This is obviously not true after de_thread() changes the leader.
|
||||||
|
After that almost every posix_cpu_timer_ method has problems.
|
||||||
|
|
||||||
|
It is not simple to fix this bug correctly. First of all, I think
|
||||||
|
that timer->it.cpu should use struct pid instead of task_struct.
|
||||||
|
Also, the locking should be reworked completely. In particular,
|
||||||
|
tasklist_lock should not be used at all. This all needs a lot of
|
||||||
|
nontrivial and hard-to-test changes.
|
||||||
|
|
||||||
|
Change __exit_signal() to do posix_cpu_timers_exit_group() when
|
||||||
|
the old leader dies during exec. This is not the fix, just the
|
||||||
|
temporary hack to hide the problem for 2.6.37 and stable. IOW,
|
||||||
|
this is obviously wrong but this is what we currently have anyway:
|
||||||
|
cpu timers do not work after mt exec.
|
||||||
|
|
||||||
|
In theory this change adds another race. The exiting leader can
|
||||||
|
detach the timers which were attached to the new leader. However,
|
||||||
|
the window between de_thread() and release_task() is small, we
|
||||||
|
can pretend that sys_timer_create() was called before de_thread().
|
||||||
|
|
||||||
|
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
|
||||||
|
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||||
|
---
|
||||||
|
kernel/exit.c | 8 ++++++++
|
||||||
|
1 files changed, 8 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/kernel/exit.c b/kernel/exit.c
|
||||||
|
index 0312022..1eff9e4 100644
|
||||||
|
--- a/kernel/exit.c
|
||||||
|
+++ b/kernel/exit.c
|
||||||
|
@@ -95,6 +95,14 @@ static void __exit_signal(struct task_struct *tsk)
|
||||||
|
sig->tty = NULL;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
+ * This can only happen if the caller is de_thread().
|
||||||
|
+ * FIXME: this is the temporary hack, we should teach
|
||||||
|
+ * posix-cpu-timers to handle this case correctly.
|
||||||
|
+ */
|
||||||
|
+ if (unlikely(has_group_leader_pid(tsk)))
|
||||||
|
+ posix_cpu_timers_exit_group(tsk);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
* If there is any task waiting for the group exit
|
||||||
|
* then notify it:
|
||||||
|
*/
|
||||||
|
--
|
||||||
|
1.7.3.2
|
||||||
|
|
Loading…
Reference in New Issue
Block a user