From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id C72302037F for ; Tue, 12 Mar 2019 04:00:46 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 07/13] githttpbackend: check for other errors and relax CRLF check Date: Tue, 12 Mar 2019 04:00:40 +0000 Message-Id: <20190312040046.4619-8-e@80x24.org> In-Reply-To: <20190312040046.4619-1-e@80x24.org> References: <20190312040046.4619-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: 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. --- lib/PublicInbox/GitHTTPBackend.pm | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/PublicInbox/GitHTTPBackend.pm b/lib/PublicInbox/GitHTTPBackend.pm index be5b924..2e4a954 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/); -- EW