aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sys.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sys.c')
-rw-r--r--kernel/sys.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/kernel/sys.c b/kernel/sys.c
index a101ba36c444..dd948a1fca4c 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -621,11 +621,18 @@ static int set_user(struct cred *new)
621 if (!new_user) 621 if (!new_user)
622 return -EAGAIN; 622 return -EAGAIN;
623 623
624 /*
625 * We don't fail in case of NPROC limit excess here because too many
626 * poorly written programs don't check set*uid() return code, assuming
627 * it never fails if called by root. We may still enforce NPROC limit
628 * for programs doing set*uid()+execve() by harmlessly deferring the
629 * failure to the execve() stage.
630 */
624 if (atomic_read(&new_user->processes) >= rlimit(RLIMIT_NPROC) && 631 if (atomic_read(&new_user->processes) >= rlimit(RLIMIT_NPROC) &&
625 new_user != INIT_USER) { 632 new_user != INIT_USER)
626 free_uid(new_user); 633 current->flags |= PF_NPROC_EXCEEDED;
627 return -EAGAIN; 634 else
628 } 635 current->flags &= ~PF_NPROC_EXCEEDED;
629 636
630 free_uid(new->user); 637 free_uid(new->user);
631 new->user = new_user; 638 new->user = new_user;