diff options
author | Vicent Marti <tanoku@gmail.com> | 2012-09-11 23:05:24 +0200 |
---|---|---|
committer | Vicent Marti <tanoku@gmail.com> | 2012-09-11 23:05:24 +0200 |
commit | c859184bb459d9801a394dc44f5b0b0e55453263 (patch) | |
tree | 33039b8911dbcba39e9270b73ee152956444f43d /src/blob.c | |
parent | 1f35e89dbf6e0be8952cc4324a45fd600be5ca05 (diff) | |
download | libgit2-c859184bb459d9801a394dc44f5b0b0e55453263.tar.gz |
Properly handle p_reads
Diffstat (limited to 'src/blob.c')
-rw-r--r-- | src/blob.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/src/blob.c b/src/blob.c index 699adec6b..6267ae7b2 100644 --- a/src/blob.c +++ b/src/blob.c @@ -68,6 +68,7 @@ static int write_file_stream( int fd, error; char buffer[4096]; git_odb_stream *stream = NULL; + ssize_t read_len, written = 0; if ((error = git_odb_open_wstream( &stream, odb, (size_t)file_size, GIT_OBJ_BLOB)) < 0) @@ -78,20 +79,18 @@ static int write_file_stream( return -1; } - while (!error && file_size > 0) { - ssize_t read_len = p_read(fd, buffer, sizeof(buffer)); - - if (read_len < 0) { - giterr_set( - GITERR_OS, "Failed to create blob. Can't read whole file"); - error = -1; - } - else if (!(error = stream->write(stream, buffer, read_len))) - file_size -= read_len; + while (!error && (read_len = p_read(fd, buffer, sizeof(buffer))) > 0) { + error = stream->write(stream, buffer, read_len); + written += read_len; } p_close(fd); + if (written != file_size || read_len < 0) { + giterr_set(GITERR_OS, "Failed to read file into stream"); + error = -1; + } + if (!error) error = stream->finalize_write(oid, stream); |