about summary refs log tree commit homepage
path: root/lib/PublicInbox/GitHTTPBackend.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-03-10 10:32:33 +0000
committerEric Wong <e@80x24.org>2019-04-04 09:13:58 +0000
commite1a3462f01d9bedd392545a0cf5f2983602dfa03 (patch)
treeb440fbf6f209cb610c3716f99157d039811e2b7f /lib/PublicInbox/GitHTTPBackend.pm
parent5cf5b6d19d931fce6053324b9a9540ad29487069 (diff)
downloadpublic-inbox-e1a3462f01d9bedd392545a0cf5f2983602dfa03.tar.gz
Reads to git-http-backend(1) could fail or EOF prematurely,
so we must be ready for that case.

Furthermore, cgit (and possibly other CGI) uses LF instead
of CRLF, so support those programs, too.
Diffstat (limited to 'lib/PublicInbox/GitHTTPBackend.pm')
-rw-r--r--lib/PublicInbox/GitHTTPBackend.pm11
1 files changed, 6 insertions, 5 deletions
diff --git a/lib/PublicInbox/GitHTTPBackend.pm b/lib/PublicInbox/GitHTTPBackend.pm
index f6528c45..cd8cdf84 100644
--- a/lib/PublicInbox/GitHTTPBackend.pm
+++ b/lib/PublicInbox/GitHTTPBackend.pm
@@ -201,8 +201,8 @@ sub serve_smart {
         my $qsp = PublicInbox::Qspawn->new([qw(git http-backend)], \%env, $rdr);
         $qsp->psgi_return($env, $limiter, sub {
                 my ($r, $bref) = @_;
-                $r = parse_cgi_headers($bref) or return; # incomplete headers
-                $r->[0] == 403 ? serve_dumb($env, $git, $path) : $r;
+                my $res = parse_cgi_headers($r, $bref) or return; # incomplete
+                $res->[0] == 403 ? serve_dumb($env, $git, $path) : $res;
         });
 }
 
@@ -247,12 +247,13 @@ sub input_prepare {
 }
 
 sub parse_cgi_headers {
-        my ($bref) = @_;
-        $$bref =~ s/\A(.*?)\r\n\r\n//s or return;
+        my ($r, $bref) = @_;
+        return r(500) unless defined $r && $r >= 0;
+        $$bref =~ s/\A(.*?)\r?\n\r?\n//s or return $r == 0 ? r(500) : undef;
         my $h = $1;
         my $code = 200;
         my @h;
-        foreach my $l (split(/\r\n/, $h)) {
+        foreach my $l (split(/\r?\n/, $h)) {
                 my ($k, $v) = split(/:\s*/, $l, 2);
                 if ($k =~ /\AStatus\z/i) {
                         ($code) = ($v =~ /\b(\d+)\b/);