Commit 3547b122b57f4aafd173013d7f82e326b9cffb24

Carlos Martín Nieto 2015-10-30T21:36:51

filebuf: use an internal buffer This reduces the chances of a crash in the thread tests. This shouldn't affect general usage too much, since the main usage of these functions are to read into an empty buffer.

diff --git a/src/fileops.c b/src/fileops.c
index 9bef028..cfc22bb 100644
--- a/src/fileops.c
+++ b/src/fileops.c
@@ -153,14 +153,15 @@ int git_futils_readbuffer_fd(git_buf *buf, git_file fd, size_t len)
 }
 
 int git_futils_readbuffer_updated(
-	git_buf *buf, const char *path, git_oid *checksum, int *updated)
+	git_buf *out, const char *path, git_oid *checksum, int *updated)
 {
 	int error;
 	git_file fd;
 	struct stat st;
+	git_buf buf = GIT_BUF_INIT;
 	git_oid checksum_new;
 
-	assert(buf && path && *path);
+	assert(out && path && *path);
 
 	if (updated != NULL)
 		*updated = 0;
@@ -182,15 +183,15 @@ int git_futils_readbuffer_updated(
 	if ((fd = git_futils_open_ro(path)) < 0)
 		return fd;
 
-	if (git_futils_readbuffer_fd(buf, fd, (size_t)st.st_size) < 0) {
+	if (git_futils_readbuffer_fd(&buf, fd, (size_t)st.st_size) < 0) {
 		p_close(fd);
 		return -1;
 	}
 
 	p_close(fd);
 
-	if ((error = git_hash_buf(&checksum_new, buf->ptr, buf->size)) < 0) {
-		git_buf_free(buf);
+	if ((error = git_hash_buf(&checksum_new, buf.ptr, buf.size)) < 0) {
+		git_buf_free(&buf);
 		return error;
 	}
 
@@ -198,7 +199,7 @@ int git_futils_readbuffer_updated(
 	 * If we were given a checksum, we only want to use it if it's different
 	 */
 	if (checksum && !git_oid__cmp(checksum, &checksum_new)) {
-		git_buf_free(buf);
+		git_buf_free(&buf);
 		if (updated)
 			*updated = 0;
 
@@ -214,6 +215,9 @@ int git_futils_readbuffer_updated(
 	if (updated != NULL)
 		*updated = 1;
 
+	git_buf_swap(out, &buf);
+	git_buf_free(&buf);
+
 	return 0;
 }