diff options
Diffstat (limited to 'kernel/sys.c')
-rw-r--r-- | kernel/sys.c | 15 |
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; |