about summary refs log tree commit homepage
path: root/lib/PublicInbox/HTTPD/Async.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2022-12-23 11:05:12 +0000
committerEric Wong <e@80x24.org>2022-12-23 12:44:23 +0000
commit9ea503ef65426070303fe1929f456b3591d74d93 (patch)
tree9ff7c77c00f0c665717e4a1ea64710d4eb67c03b /lib/PublicInbox/HTTPD/Async.pm
parentf1817699f3f3feb964653eaf3586477abbf7947d (diff)
downloadpublic-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.pm3
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);