]> Sergey Matveev's repositories - public-inbox.git/commitdiff
githttpbackend: error checking for input handling
authorEric Wong <e@80x24.org>
Sat, 26 Nov 2016 08:34:34 +0000 (08:34 +0000)
committerEric Wong <e@80x24.org>
Sat, 26 Nov 2016 08:34:34 +0000 (08:34 +0000)
This was sloppy code, all calls need to be checked
for failure.

lib/PublicInbox/GitHTTPBackend.pm

index d4914795f3ebfbacc206466721a4e27d0a9a38f7..322005b5678b035177b8f5c20b9291fb077371c5 100644 (file)
@@ -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;
 }