Author: Andres Miller <a1kmm@mware.virtualave.net>
[ircu2.10.12-pk.git] / ircd / s_bsd.c
index 459c9d399c929f2409eb7f158dcf6bd6bf9ad394..08c451161ee7ae208b9370656e098e1dfd00a5a3 100644 (file)
@@ -196,10 +196,12 @@ static void connect_dns_callback(void* vptr, struct DNSReply* reply)
 void close_connections(int close_stderr)
 {
   int i;
+#if 0
   close(0);
   close(1);
   if (close_stderr)
     close(2);
+#endif
   for (i = 3; i < MAXCONNECTIONS; ++i)
     close(i);
 }
@@ -608,6 +610,16 @@ void add_connection(struct Listener* listener, int fd) {
     close(fd);
     return;
   }
+  /*
+   * Disable IP (*not* TCP) options.  In particular, this makes it impossible
+   * to use source routing to connect to the server.  If we didn't do this
+   * (and if intermediate networks didn't drop source-routed packets), an
+   * attacker could successfully IP spoof us...and even return the anti-spoof
+   * ping, because the options would cause the packet to be routed back to
+   * the spoofer's machine.  When we disable the IP options, we delete the
+   * source route, and the normal routing takes over.
+   */
+  os_disable_options(fd);
 
   /*
    * Add this local client to the IPcheck registry.
@@ -628,6 +640,7 @@ void add_connection(struct Listener* listener, int fd) {
    * Copy ascii address to 'sockhost' just in case. Then we have something
    * valid to put into error messages...  
    */
+  SetIPChecked(new_client);
   ircd_ntoa_r(cli_sock_ip(new_client), (const char*) &addr.sin_addr);   
   strcpy(cli_sockhost(new_client), cli_sock_ip(new_client));
   (cli_ip(new_client)).s_addr = addr.sin_addr.s_addr;
@@ -762,7 +775,7 @@ static int read_packet(struct Client *cptr, int socket_ready)
 
     /* If there's still data to process, wait 2 seconds first */
     if (DBufLength(&(cli_recvQ(cptr))) && !NoNewLine(cptr) &&
-       !(cli_freeflag(cptr) & FREEFLAG_TIMER)) {
+       !t_onqueue(&(cli_proc(cptr)))) {
       Debug((DEBUG_LIST, "Adding client process timer for %C", cptr));
       cli_freeflag(cptr) |= FREEFLAG_TIMER;
       timer_add(&(cli_proc(cptr)), client_timer_callback, cli_connect(cptr),
@@ -1055,9 +1068,9 @@ static void client_timer_callback(struct Event* ev)
 
   assert(0 == cptr || con == cli_connect(cptr));
 
-  con_freeflag(con) &= ~FREEFLAG_TIMER; /* timer has expired... */
-
   if (ev_type(ev)== ET_DESTROY) {
+    con_freeflag(con) &= ~FREEFLAG_TIMER; /* timer has expired... */
+
     if (!con_freeflag(con) && !cptr)
       free_connection(con); /* client is being destroyed */
   } else {