lib/PublicInbox/NNTP.pm | 13 ++++++++----- diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 56d8e010f96b7d2db8061f100213b1e47f6eaf8e..1e564634901ef69d8221d2ddbb19dc4d13cdb8b2 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -590,9 +590,10 @@ my $lim = 100; my $err; do { - eval { $cb->(\$beg) }; + eval { $cb->(\$beg, \$lim) }; } until (($err = $@) || $self->{closed} || - ++$beg > $end || !--$lim || $self->{write_buf_size}); + ++$beg > $end || --$lim < 0 || + $self->{write_buf_size}); if ($err || $self->{closed}) { $self->{long_res} = undef; @@ -609,7 +610,7 @@ } else { update_idle_time($self); $self->watch_read(1); } - } elsif (!$lim || $self->{write_buf_size}) { + } elsif ($lim < 0 || $self->{write_buf_size}) { # no recursion, schedule another call ASAP # but only after all pending writes are done update_idle_time($self); @@ -715,11 +716,12 @@ my ($beg, $end) = @$r; more($self, $xhdr ? r221 : r225); my $off = 0; long_response($self, $beg, $end, sub { - my ($i) = @_; + my ($i, $lim) = @_; my $res = $srch->query_xover($beg, $end, $off); my $msgs = $res->{msgs}; my $nr = scalar @$msgs or return; $off += $nr; + $$lim -= $nr; my $tmp = ''; foreach my $s (@$msgs) { $tmp .= $s->num . ' ' . $s->$field . "\r\n"; @@ -853,11 +855,12 @@ more($self, "224 Overview information follows for $beg to $end"); my $srch = $self->{ng}->search; my $off = 0; long_response($self, $beg, $end, sub { - my ($i) = @_; + my ($i, $lim) = @_; my $res = $srch->query_xover($beg, $end, $off); my $msgs = $res->{msgs}; my $nr = scalar @$msgs or return; $off += $nr; + $$lim -= $nr; # OVERVIEW.FMT more($self, join("\r\n", map {