]> git.etc.gen.nz Git - spong.git/commitdiff
added alarm block around client connection code in listen_for_updates()
authorStephen L Johnson <sjohnson@monsters.org>
Fri, 18 Feb 2000 20:38:04 +0000 (20:38 +0000)
committerStephen L Johnson <sjohnson@monsters.org>
Fri, 18 Feb 2000 20:38:04 +0000 (20:38 +0000)
src/spong-server.pl

index 205a610bbccbf4df1aba24a5b3ca9ae92e83727d..153e0170a12a67cdfd104baa06d66dc282f653a0 100755 (executable)
@@ -69,6 +69,7 @@ foreach $host ( Spong::HostList->new( "all" )->hosts() ) {
 # additional subprocesses, they just deal with the message setting at their
 # queue, and then process the next message as it comes in.
 
+$SIG{'ALRM'} = 'IGNORE';
 $SIG{'CHLD'} = \&chld_handler;
 
 if( $upd_pid = fork() ) {
@@ -124,14 +125,31 @@ sub listen_for_updates {
 
       # Read all from the client, and disconnect, we process the message next.
 
-      my $header = <CLIENT>; chomp $header;
+      my( $header, $ok ) = ( "", 0 );
       my( $message, $cnt, $line ) = ( "", "", "" );
-      while( defined( $line = <CLIENT> ) ) { 
-        last if ($cnt += length($line)) > 100000;
-        $message .= $line; 
-      }
+
+      # Set an alarm on this block in case the client runs into problems
+      eval 
+      {  
+         local $SIG{'ALRM'} = sub { die; };
+         alarm($SPONG_SERVER_ALARM) if $SPONG_SERVER_ALARM;
+
+         $header = <CLIENT>; chomp $header;
+         while( defined( $line = <CLIENT> ) ) { 
+           last if ($cnt += length($line)) > 100000;
+           $message .= $line; 
+         }
+
+         $ok = 1;
+      };
+      alarm(0);
       close( CLIENT );
 
+      if ( ! $ok ) {
+         &error( "ss_update: Connection from $paddr timed out" );
+         next;
+     }
+
       # Now depending on what kind of message it is, pass it off to a routine
       # that can process the message.  Currently valid messages are "status", 
       # "ack", "config", and "stat".