From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) 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.0 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 669A71FF76 for ; Sat, 26 Nov 2016 08:55:24 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] githttpbackend: error checking for input handling Date: Sat, 26 Nov 2016 08:55:24 +0000 Message-Id: <20161126085524.16977-1-e@80x24.org> List-Id: This was sloppy code, all calls need to be checked for failure. --- lib/PublicInbox/GitHTTPBackend.pm | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/PublicInbox/GitHTTPBackend.pm b/lib/PublicInbox/GitHTTPBackend.pm index d491479..322005b 100644 --- a/lib/PublicInbox/GitHTTPBackend.pm +++ b/lib/PublicInbox/GitHTTPBackend.pm @@ -273,6 +273,10 @@ sub serve_smart { sub input_to_file { my ($env) = @_; my $in = IO::File->new_tmpfile; + unless (defined $in) { + err($env, "could not open temporary file: $!"); + return; + } my $input = $env->{'psgi.input'}; my $buf; while (1) { @@ -281,11 +285,22 @@ sub input_to_file { err($env, "error reading input: $!"); return; } - last if ($r == 0); - $in->write($buf); + my $off = 0; + while ($r > 0) { + my $w = syswrite($in, $buf, $r, $off); + if (defined $w) { + $r -= $w; + $off += $w; + } else { + err($env, "error writing temporary file: $!"); + return; + } + } + } + unless (defined(sysseek($in, 0, SEEK_SET))) { + err($env, "error seeking temporary file: $!"); + return; } - $in->flush; - $in->sysseek(0, SEEK_SET); return $in; } -- EW