[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: branches/work/icecream-make-it-cool/services
From: Dirk Mueller <mueller () kde ! org>
Date: 2008-02-08 13:26:24
Message-ID: 1202477184.666062.16154.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 772332 by mueller:
DoS protection for the scheduler
M +40 -28 scheduler.cpp
--- branches/work/icecream-make-it-cool/services/scheduler.cpp #772331:772332
@@ -1823,7 +1823,7 @@
log_perror ("bind()");
return -1;
}
- if (listen (fd, 20) < 0)
+ if (listen (fd, 10) < 0)
{
log_perror ("listen()");
return -1;
@@ -1975,6 +1975,8 @@
signal(SIGINT, trigger_exit);
signal(SIGALRM, trigger_exit);
+ time_t next_listen = 0;
+
while (!exit_main_loop)
{
struct timeval tv;
@@ -1987,14 +1989,14 @@
fd_set read_set;
int max_fd = 0;
FD_ZERO (&read_set);
- if (toanswer.size() < 100) // TODO: this is rather pointless as toanswer is now a queue of queues
- { // don't let us overrun
+ if (time(0) >= next_listen)
+ {
max_fd = listen_fd;
FD_SET (listen_fd, &read_set);
+ if (text_fd > max_fd)
+ max_fd = text_fd;
+ FD_SET (text_fd, &read_set);
}
- if (text_fd > max_fd)
- max_fd = text_fd;
- FD_SET (text_fd, &read_set);
if (broad_fd > max_fd)
max_fd = broad_fd;
FD_SET (broad_fd, &read_set);
@@ -2027,31 +2029,41 @@
if (FD_ISSET (listen_fd, &read_set))
{
max_fd--;
- remote_len = sizeof (remote_addr);
- remote_fd = accept (listen_fd,
- (struct sockaddr *) &remote_addr,
- &remote_len );
- if (remote_fd < 0 && errno != EAGAIN && errno != EINTR)
- {
- log_perror ("accept()");
- return 1;
- }
- if (remote_fd >= 0)
- {
- CS *cs = new CS (remote_fd, (struct sockaddr*) &remote_addr, remote_len, false);
- trace() << "accepted " << cs->name << endl;
- cs->last_talk = time( 0 );
+ bool pending_connections = true;
+ while (pending_connections)
+ {
+ remote_len = sizeof (remote_addr);
+ remote_fd = accept (listen_fd,
+ (struct sockaddr *) &remote_addr,
+ &remote_len );
+ if (remote_fd < 0)
+ pending_connections = false;
- if ( !cs->protocol ) // protocol mismatch
+ if (remote_fd < 0 && errno != EAGAIN && errno != EINTR && errno
+ != EWOULDBLOCK)
{
- delete cs;
- continue;
+ log_perror ("accept()");
+ /* don't quit because of ECONNABORTED, this can happen during
+ * floods */
}
- fd2cs[cs->fd] = cs;
- while (!cs->read_a_bit () || cs->has_msg ())
- if(! handle_activity (cs))
- break;
- }
+ if (remote_fd >= 0)
+ {
+ CS *cs = new CS (remote_fd, (struct sockaddr*) &remote_addr, remote_len, false);
+ trace() << "accepted " << cs->name << endl;
+ cs->last_talk = time( 0 );
+
+ if ( !cs->protocol ) // protocol mismatch
+ {
+ delete cs;
+ continue;
+ }
+ fd2cs[cs->fd] = cs;
+ while (!cs->read_a_bit () || cs->has_msg ())
+ if(! handle_activity (cs))
+ break;
+ }
+ }
+ next_listen = time(0) + 1;
}
if (max_fd && FD_ISSET (text_fd, &read_set))
{
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic