diff options
author | Eric Wong <e@80x24.org> | 2019-12-28 20:55:16 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2019-12-28 21:42:51 +0000 |
commit | ac1ac3b4e2858bcee5a644aac8b6320422ea7383 (patch) | |
tree | adc43631dfc65dd6473aba8d190c66b29a52b8eb | |
parent | 3647997eaf49410bbf3e33bfb3874c611ab0c38b (diff) | |
download | public-inbox-ac1ac3b4e2858bcee5a644aac8b6320422ea7383.tar.gz |
HTTP::getline_pull and NNTP::long_step will both populate {wbuf} manually to avoid recursion, so we need to account for an empty-but-present {wbuf} while dispatching msg_more().
-rw-r--r-- | lib/PublicInbox/DS.pm | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/lib/PublicInbox/DS.pm b/lib/PublicInbox/DS.pm index 62aa3c2d..8f17f7fb 100644 --- a/lib/PublicInbox/DS.pm +++ b/lib/PublicInbox/DS.pm @@ -574,15 +574,18 @@ use constant MSG_MORE => ($^O eq 'linux') ? 0x8000 : 0; sub msg_more ($$) { my $self = $_[0]; my $sock = $self->{sock} or return 1; + my $wbuf = $self->{wbuf}; - if (MSG_MORE && !$self->{wbuf} && ref($sock) ne 'IO::Socket::SSL') { + if (MSG_MORE && (!defined($wbuf) || !scalar(@$wbuf)) && + ref($sock) ne 'IO::Socket::SSL') { my $n = send($sock, $_[1], MSG_MORE); if (defined $n) { my $nlen = bytes::length($_[1]) - $n; return 1 if $nlen == 0; # all done! # queue up the unwritten substring: my $tmpio = tmpio($self, \($_[1]), $n) or return 0; - $self->{wbuf} = [ $tmpio ]; + $self->{wbuf} //= $wbuf //= []; + push @$wbuf, $tmpio; epwait($sock, EPOLLOUT|EPOLLONESHOT); return 0; } |