summaryrefslogtreecommitdiffstats
path: root/arch/alpha
diff options
context:
space:
mode:
authorTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>2010-09-04 01:34:28 +0000
committerDavid S. Miller <davem@davemloft.net>2010-09-07 13:57:23 -0700
commit8df73ff90f00f14d2c7ff7156f7ef153f7e9d3b7 (patch)
tree9df146da5dd92eeb921fbc21f856d7660ac92b0e /arch/alpha
parent32737e934a952c1b0c744f2a78d80089d15c7ee3 (diff)
downloadop-kernel-dev-8df73ff90f00f14d2c7ff7156f7ef153f7e9d3b7.zip
op-kernel-dev-8df73ff90f00f14d2c7ff7156f7ef153f7e9d3b7.tar.gz
UNIX: Do not loop forever at unix_autobind().
We assumed that unix_autobind() never fails if kzalloc() succeeded. But unix_autobind() allows only 1048576 names. If /proc/sys/fs/file-max is larger than 1048576 (e.g. systems with more than 10GB of RAM), a local user can consume all names using fork()/socket()/bind(). If all names are in use, those who call bind() with addr_len == sizeof(short) or connect()/sendmsg() with setsockopt(SO_PASSCRED) will continue while (1) yield(); loop at unix_autobind() till a name becomes available. This patch adds a loop counter in order to give up after 1048576 attempts. Calling yield() for once per 256 attempts may not be sufficient when many names are already in use, for __unix_find_socket_byname() can take long time under such circumstance. Therefore, this patch also adds cond_resched() call. Note that currently a local user can consume 2GB of kernel memory if the user is allowed to create and autobind 1048576 UNIX domain sockets. We should consider adding some restriction for autobind operation. Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/alpha')
0 files changed, 0 insertions, 0 deletions
OpenPOWER on IntegriCloud