summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2013-03-26 12:42:24 -0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2013-03-26 12:42:24 -0700
commit06d7abb13c1a948f376f05bbd708712c512e6e1b (patch)
tree28331f46b5297895c13566ffcafe1d5f6cca8de1
parentMerge branch 'ob/imap-send-ssl-verify' into maint (diff)
parentGit.pm: fix cat_blob crashes on large files (diff)
downloadtgif-06d7abb13c1a948f376f05bbd708712c512e6e1b.tar.xz
Merge branch 'jc/perl-cat-blob' into maint
perl/Git.pm::cat_blob slurped everything in core only to write it out to a file descriptor, which was not a very smart thing to do. * jc/perl-cat-blob: Git.pm: fix cat_blob crashes on large files
-rw-r--r--perl/Git.pm17
1 files changed, 7 insertions, 10 deletions
diff --git a/perl/Git.pm b/perl/Git.pm
index a56d1e76f7..57a17160f9 100644
--- a/perl/Git.pm
+++ b/perl/Git.pm
@@ -965,20 +965,22 @@ sub cat_blob {
my $size = $1;
my $blob;
- my $bytesRead = 0;
+ my $bytesLeft = $size;
while (1) {
- my $bytesLeft = $size - $bytesRead;
last unless $bytesLeft;
my $bytesToRead = $bytesLeft < 1024 ? $bytesLeft : 1024;
- my $read = read($in, $blob, $bytesToRead, $bytesRead);
+ my $read = read($in, $blob, $bytesToRead);
unless (defined($read)) {
$self->_close_cat_blob();
throw Error::Simple("in pipe went bad");
}
-
- $bytesRead += $read;
+ unless (print $fh $blob) {
+ $self->_close_cat_blob();
+ throw Error::Simple("couldn't write to passed in filehandle");
+ }
+ $bytesLeft -= $read;
}
# Skip past the trailing newline.
@@ -993,11 +995,6 @@ sub cat_blob {
throw Error::Simple("didn't find newline after blob");
}
- unless (print $fh $blob) {
- $self->_close_cat_blob();
- throw Error::Simple("couldn't write to passed in filehandle");
- }
-
return $size;
}