diff options
author | Eric Wong <e@80x24.org> | 2018-04-18 20:30:22 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2018-04-18 20:30:31 +0000 |
commit | 119463b3b8517e5ec149198bb83588999118ee1d (patch) | |
tree | 35711e08b5070215fbc18a7ca63077c5deae8337 | |
parent | 15eb65ffd59c7cf5cce67c6b7621f63194fd1083 (diff) | |
download | public-inbox-119463b3b8517e5ec149198bb83588999118ee1d.tar.gz |
Somebody hitting "\n" into telnet shouldn't hold a client up indefinitely and prevent shutdown.
-rw-r--r-- | lib/PublicInbox/NNTP.pm | 5 | ||||
-rw-r--r-- | t/nntpd.t | 2 |
2 files changed, 5 insertions, 2 deletions
diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 23be7754..c574c9e6 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -116,6 +116,7 @@ sub args_ok ($$) { sub process_line ($$) { my ($self, $l) = @_; my ($req, @args) = split(/\s+/, $l); + return unless defined($req); $req = lc($req); $req = eval { no strict 'refs'; @@ -955,7 +956,7 @@ sub event_read { $self->{rbuf} .= $$buf; } my $r = 1; - while ($r > 0 && $self->{rbuf} =~ s/\A\s*([^\r\n]+)\r?\n//) { + while ($r > 0 && $self->{rbuf} =~ s/\A\s*([^\r\n]*)\r?\n//) { my $line = $1; return $self->close if $line =~ /[[:cntrl:]]/s; my $t0 = now(); @@ -975,7 +976,7 @@ sub event_read { sub watch_read { my ($self, $bool) = @_; my $rv = $self->SUPER::watch_read($bool); - if ($bool && $self->{rbuf} ne '') { + if ($bool && index($self->{rbuf}, "\n") >= 0) { # Force another read if there is a pipelined request. # We don't know if the socket has anything for us to read, # and we must double-check again by the time the timer fires @@ -122,6 +122,8 @@ EOF is($buf, "201 server ready - post via email\r\n", 'got greeting'); $s->autoflush(1); + ok(syswrite($s, " \r\n"), 'wrote spaces'); + ok(syswrite($s, "\r\n"), 'wrote nothing'); syswrite($s, "NEWGROUPS\t19990424 000000 \033GMT\007\r\n"); is(0, sysread($s, $buf, 4096), 'GOT EOF on cntrl'); |