Commit 83f62a2e authored by Oleg Nesterov's avatar Oleg Nesterov Committed by Linus Torvalds

exec:check_unsafe_exec: use while_each_thread() rather than next_thread()

next_thread() should be avoided, change check_unsafe_exec() to use
while_each_thread().

Nobody except signal->curr_target actually needs next_thread-like code,
and we need to change (fix) this interface.  This particular code is fine,
p == current.  But in general the code like this can loop forever if p
exits and next_thread(t) can't reach the unhashed thread.

This also saves 32 bytes.
Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
Acked-by: default avatarKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Kees Cook <keescook@chromium.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 68ce670b
...@@ -1243,10 +1243,11 @@ static int check_unsafe_exec(struct linux_binprm *bprm) ...@@ -1243,10 +1243,11 @@ static int check_unsafe_exec(struct linux_binprm *bprm)
if (current->no_new_privs) if (current->no_new_privs)
bprm->unsafe |= LSM_UNSAFE_NO_NEW_PRIVS; bprm->unsafe |= LSM_UNSAFE_NO_NEW_PRIVS;
t = p;
n_fs = 1; n_fs = 1;
spin_lock(&p->fs->lock); spin_lock(&p->fs->lock);
rcu_read_lock(); rcu_read_lock();
for (t = next_thread(p); t != p; t = next_thread(t)) { while_each_thread(p, t) {
if (t->fs == p->fs) if (t->fs == p->fs)
n_fs++; n_fs++;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment