diff options
author | Eric Wong <e@80x24.org> | 2018-03-07 19:05:20 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2018-03-14 06:16:13 +0000 |
commit | b912a4ea144004aeedde2e28dee33c6c83dd2273 (patch) | |
tree | f29394141ac3fd4f2219fe6b43d190ce0121c0e7 | |
parent | 747dadaf56334765b29e63e6559e735b914edff9 (diff) | |
download | public-inbox-b912a4ea144004aeedde2e28dee33c6c83dd2273.tar.gz |
Some clients pipeline requests aggressively (enough to match LINE_MAX) and we should not read from the client socket until we know there's no pending command in our read buffer. Reported-and-tested-by: Sergey Organov <sorganov@gmail.com>
-rw-r--r-- | lib/PublicInbox/NNTP.pm | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 1e564634..267fe4b9 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -949,10 +949,12 @@ sub event_write { sub event_read { my ($self) = @_; use constant LINE_MAX => 512; # RFC 977 section 2.3 - my $r = 1; - my $buf = $self->read(LINE_MAX) or return $self->close; - $self->{rbuf} .= $$buf; + if (index($self->{rbuf}, "\n") < 0) { + my $buf = $self->read(LINE_MAX) or return $self->close; + $self->{rbuf} .= $$buf; + } + my $r = 1; while ($r > 0 && $self->{rbuf} =~ s/\A\s*([^\r\n]+)\r?\n//) { my $line = $1; return $self->close if $line =~ /[[:cntrl:]]/s; |