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.
This commit is contained in:
Carlos Martín Nieto 2015-10-30 21:36:51 +01:00
parent eb5977991a
commit 3547b122b5

View File

@ -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;
}