about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2018-03-07 19:05:20 +0000
committerEric Wong <e@80x24.org>2018-03-14 06:16:13 +0000
commitb912a4ea144004aeedde2e28dee33c6c83dd2273 (patch)
treef29394141ac3fd4f2219fe6b43d190ce0121c0e7
parent747dadaf56334765b29e63e6559e735b914edff9 (diff)
downloadpublic-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.pm8
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;