From: Wouter Wijngaards Date: Thu, 20 Nov 2008 09:20:10 +0000 (+0000) Subject: rlimit formula X-Git-Tag: release-1.1.1~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4ea644f5a25b87f1420ab19ab5e59565d0b0dc55;p=thirdparty%2Funbound.git rlimit formula git-svn-id: file:///svn/unbound/trunk@1365 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/daemon/unbound.c b/daemon/unbound.c index 19abe0c41..b051995bb 100644 --- a/daemon/unbound.c +++ b/daemon/unbound.c @@ -97,11 +97,12 @@ static void checkrlimits(struct config_file* cfg) { #ifdef HAVE_GETRLIMIT - int list = ((cfg->do_ip4?1:0) + (cfg->do_ip6?1:0)) * - ((cfg->do_udp?1:0) + (cfg->do_tcp?1 + + int list = ((cfg->do_udp?1:0) + (cfg->do_tcp?1 + (int)cfg->incoming_num_tcp:0)); - size_t ifs = (size_t)(cfg->num_ifs==0?1:cfg->num_ifs); - size_t listen_num = list*ifs; + size_t listen_ifs = (size_t)(cfg->num_ifs==0? + ((cfg->do_ip4 && !cfg->if_automatic?1:0) + + (cfg->do_ip6?1:0)):cfg->num_ifs); + size_t listen_num = list*listen_ifs; size_t outudpnum = (size_t)cfg->outgoing_num_ports; size_t outtcpnum = cfg->outgoing_num_tcp; size_t misc = 4; /* logfile, pidfile, stdout... */ @@ -132,6 +133,8 @@ checkrlimits(struct config_file* cfg) log_warn("setrlimit: %s", strerror(errno)); log_warn("cannot increase max open fds from %u to %u", (unsigned)avail, (unsigned)total+10); + if(numthread*perthread_noudp+15 > avail) + fatal_exit("too much tcp. not enough fds."); cfg->outgoing_num_ports = (int)((avail - numthread*perthread_noudp - 10 /* safety margin */) /numthread); diff --git a/doc/Changelog b/doc/Changelog index 6a0eeca86..919f2b71d 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,5 +1,6 @@ 20 November 2008: Wouter - fixup fatal error due to faulty error checking after tcp accept. + - add check in rlimit to avoid integer underflow. Better formula. 19 November 2008: Wouter - bug #219: fixed so that syslog which delays opening until the first