about summary refs log tree commit homepage
path: root/lib/PublicInbox/GitHTTPBackend.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2016-11-26 08:34:34 +0000
committerEric Wong <e@80x24.org>2016-11-26 08:34:34 +0000
commit57024ca2ae548a103dae12efaaf2f852d2c47e0e (patch)
tree1fdeb673792c131b7f49e32e203bfdef19b37cc0 /lib/PublicInbox/GitHTTPBackend.pm
parent0cb5397f9ef26b22e529876ba904f1afe24f62da (diff)
downloadpublic-inbox-57024ca2ae548a103dae12efaaf2f852d2c47e0e.tar.gz
This was sloppy code, all calls need to be checked
for failure.
Diffstat (limited to 'lib/PublicInbox/GitHTTPBackend.pm')
-rw-r--r--lib/PublicInbox/GitHTTPBackend.pm23
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/PublicInbox/GitHTTPBackend.pm b/lib/PublicInbox/GitHTTPBackend.pm
index d4914795..322005b5 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;
 }