]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - kernel/sys.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[mv-sheeva.git] / kernel / sys.c
index a101ba36c4441f5eca898b1da0d2ad9b5b2f51a5..dd948a1fca4c7e0b70ed7d5dc3902350c65d0c25 100644 (file)
@@ -621,11 +621,18 @@ static int set_user(struct cred *new)
        if (!new_user)
                return -EAGAIN;
 
+       /*
+        * We don't fail in case of NPROC limit excess here because too many
+        * poorly written programs don't check set*uid() return code, assuming
+        * it never fails if called by root.  We may still enforce NPROC limit
+        * for programs doing set*uid()+execve() by harmlessly deferring the
+        * failure to the execve() stage.
+        */
        if (atomic_read(&new_user->processes) >= rlimit(RLIMIT_NPROC) &&
-                       new_user != INIT_USER) {
-               free_uid(new_user);
-               return -EAGAIN;
-       }
+                       new_user != INIT_USER)
+               current->flags |= PF_NPROC_EXCEEDED;
+       else
+               current->flags &= ~PF_NPROC_EXCEEDED;
 
        free_uid(new->user);
        new->user = new_user;