diff options
author | Eric Wong <e@80x24.org> | 2022-12-23 11:05:12 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2022-12-23 12:44:23 +0000 |
commit | 9ea503ef65426070303fe1929f456b3591d74d93 (patch) | |
tree | 9ff7c77c00f0c665717e4a1ea64710d4eb67c03b /lib/PublicInbox/HTTPD/Async.pm | |
parent | f1817699f3f3feb964653eaf3586477abbf7947d (diff) | |
download | public-inbox-9ea503ef65426070303fe1929f456b3591d74d93.tar.gz |
httpd: avoid crash on cgit -> coderepo 404 fallback
A trickled cgit response can cause HTTPD::Async->event_step to fire an extra time after header parsing. We need to account for the lack of async_pass call populating ->{fh} and ->{http} in that case and avoid calling $self->{fh}->write when there's no {fh}.
Diffstat (limited to 'lib/PublicInbox/HTTPD/Async.pm')
-rw-r--r-- | lib/PublicInbox/HTTPD/Async.pm | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/lib/PublicInbox/HTTPD/Async.pm b/lib/PublicInbox/HTTPD/Async.pm index cb76cfab..9e592f47 100644 --- a/lib/PublicInbox/HTTPD/Async.pm +++ b/lib/PublicInbox/HTTPD/Async.pm @@ -48,7 +48,8 @@ sub event_step { # this may call async_pass when headers are done $cb->(my $refcnt_guard = delete $self->{arg}); } elsif (my $sock = $self->{sock}) { - my $http = $self->{http}; + # $http may be undef if discarding body output from cgit on 404 + my $http = $self->{http} or return $self->close; # $self->{sock} is a read pipe for git-http-backend or cgit # and 65536 is the default Linux pipe size my $r = sysread($sock, my $buf, 65536); |