A few misc forkbomb defenses:

- Leave 10 processes for root-only use, the previous
  value of 1 was insufficient to run ps ax | more.
- Remove the printing of "proc: table full".  When the table
  really is full, this would flood the screen/logs, making
  the problem tougher to deal with.
- Force any process trying to fork beyond its user's maximum
  number of processes to sleep for .5 seconds before returning
  failure.  This turns 2000 rampaging fork monsters into 2000
  harmlessly snoozing fork monsters.

Reviewed by:	dillon, peter
MFC after:	1 week
This commit is contained in:
Mike Silbersack 2002-02-19 03:15:28 +00:00
parent 35a86b35c1
commit cc6712ea04

View File

@ -93,6 +93,8 @@ struct fork_args {
};
#endif
int forksleep; /* Place for fork1() to sleep on. */
static void
init_fork_list(void *data __unused)
{
@ -297,8 +299,8 @@ fork1(td, flags, procp)
* processes, maxproc is the limit.
*/
uid = p1->p_ucred->cr_ruid;
if ((nprocs >= maxproc - 1 && uid != 0) || nprocs >= maxproc) {
tablefull("proc");
if ((nprocs >= maxproc - 10 && uid != 0) || nprocs >= maxproc) {
tsleep(&forksleep, PUSER, "fork", hz / 2);
return (EAGAIN);
}
/*
@ -318,6 +320,7 @@ fork1(td, flags, procp)
* Back out the process count
*/
nprocs--;
tsleep(&forksleep, PUSER, "fork", hz / 2);
return (EAGAIN);
}