@@ -, +, @@ accept, but strict in what we send: Never exit the server process, but send a SC_RESEND message (96) to the client if we received anything we don't understand. This is consistent with SIP server implementations of other ILSs. --- C4/SIP/SIPServer.pm | 21 +++++++++------------ C4/SIP/Sip.pm | 8 -------- C4/SIP/Sip/MsgType.pm | 4 +++- 3 files changed, 12 insertions(+), 21 deletions(-) --- a/C4/SIP/SIPServer.pm +++ a/C4/SIP/SIPServer.pm @@ -21,7 +21,7 @@ use constant LOG_SIP => "local6"; # Local alias for the logging facility use vars qw(@ISA $VERSION); BEGIN { - $VERSION = 1.02; + $VERSION = 1.03; @ISA = qw(Net::Server::PreFork); } @@ -269,32 +269,29 @@ sub sip_protocol_loop { # In short, we'll take any valid message here. #my $expect = SC_STATUS; my $expect = ''; - my $strikes = 3; - while ($input = Sip::read_SIP_packet(*STDIN)) { + while (1) { + $input = Sip::read_SIP_packet(*STDIN); + unless ($input) { + print("96$CR"); + next; + } # begin input hacks ... a cheap stand in for better Telnet layer $input =~ s/^[^A-z0-9]+//s; # Kill leading bad characters... like Telnet handshakers $input =~ s/[^A-z0-9]+$//s; # Same on the end, should get DOSsy ^M line-endings too. while (chomp($input)) {warn "Extra line ending on input";} unless ($input) { - if ($strikes--) { - syslog("LOG_ERR", "sip_protocol_loop: empty input skipped"); - next; - } else { - syslog("LOG_ERR", "sip_protocol_loop: quitting after too many errors"); - die "sip_protocol_loop: quitting after too many errors"; - } + syslog("LOG_ERR", "sip_protocol_loop: empty input skipped"); + next; } # end cheap input hacks my $status = Sip::MsgType::handle($input, $self, $expect); if (!$status) { syslog("LOG_ERR", "sip_protocol_loop: failed to handle %s",substr($input,0,2)); - die "sip_protocol_loop: failed Sip::MsgType::handle('$input', $self, '$expect')"; } next if $status eq REQUEST_ACS_RESEND; if ($expect && ($status ne $expect)) { # We received a non-"RESEND" that wasn't what we were expecting. syslog("LOG_ERR", "sip_protocol_loop: expected %s, received %s, exiting", $expect, $input); - die "sip_protocol_loop: exiting: expected '$expect', received '$status'"; } # We successfully received and processed what we were expecting $expect = ''; --- a/C4/SIP/Sip.pm +++ a/C4/SIP/Sip.pm @@ -156,7 +156,6 @@ sub read_SIP_packet { # local $/ = "\r"; # don't need any of these here. use whatever the prevailing $/ is. local $/ = "\015"; # proper SPEC: (octal) \015 = (hex) x0D = (dec) 13 = (ascii) carriage return { # adapted from http://perldoc.perl.org/5.8.8/functions/readline.html - for ( my $tries = 1 ; $tries <= 3 ; $tries++ ) { undef $!; $record = readline($fh); if ( defined($record) ) { @@ -171,14 +170,7 @@ sub read_SIP_packet { while ( chomp($record) ) { 1; } $record and last; # success - } else { - if ($!) { - syslog( "LOG_DEBUG", "read_SIP_packet (try #$tries) ERROR: $! $@" ); - # die "read_SIP_packet ERROR: $!"; - warn "read_SIP_packet ERROR: $! $@"; - } } - } } if ($record) { my $len2 = length($record); --- a/C4/SIP/Sip/MsgType.pm +++ a/C4/SIP/Sip/MsgType.pm @@ -405,7 +405,9 @@ sub handle { } unless ($self->{handler}) { syslog("LOG_WARNING", "No handler defined for '%s'", $msg); - return undef; + $last_response = REQUEST_SC_RESEND; + print("$last_response\r"); + return REQUEST_ACS_RESEND; } return($self->{handler}->($self, $server)); # FIXME # FIXME: Use of uninitialized value in subroutine entry --