Skip to content

Commit

Permalink
Merge branch 'jc/perl-cat-blob'
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Junio C Hamano committed Mar 21, 2013
2 parents 98ed062 + 712c6ad commit 8d747e1
Showing 1 changed file with 7 additions and 10 deletions.
17 changes: 7 additions & 10 deletions perl/Git.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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;
}

Expand Down

0 comments on commit 8d747e1

Please sign in to comment.