summaryrefslogtreecommitdiff
path: root/src/blob.c
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2012-09-11 23:05:24 +0200
committerVicent Marti <tanoku@gmail.com>2012-09-11 23:05:24 +0200
commitc859184bb459d9801a394dc44f5b0b0e55453263 (patch)
tree33039b8911dbcba39e9270b73ee152956444f43d /src/blob.c
parent1f35e89dbf6e0be8952cc4324a45fd600be5ca05 (diff)
downloadlibgit2-c859184bb459d9801a394dc44f5b0b0e55453263.tar.gz
Properly handle p_reads
Diffstat (limited to 'src/blob.c')
-rw-r--r--src/blob.c19
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);