summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@microsoft.com>2015-02-10 22:34:03 -0500
committerEdward Thomson <ethomson@edwardthomson.com>2015-02-12 22:54:46 -0500
commit15d54fdd345dadc2854200ce5b9aad0949e3949b (patch)
tree5e6bab6912c0a87591a9573c3439359c41043d42
parent392702ee2c88d7d8aaff25f7a84acb73606f9094 (diff)
downloadlibgit2-15d54fdd345dadc2854200ce5b9aad0949e3949b.tar.gz
odb__hashlink: check st.st_size before casting
-rw-r--r--src/odb.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/src/odb.c b/src/odb.c
index 80e02ef2b..fcb21c1ce 100644
--- a/src/odb.c
+++ b/src/odb.c
@@ -216,28 +216,28 @@ int git_odb__hashfd_filtered(
int git_odb__hashlink(git_oid *out, const char *path)
{
struct stat st;
- git_off_t size;
+ size_t size;
int result;
if (git_path_lstat(path, &st) < 0)
return -1;
- size = st.st_size;
-
- if (!git__is_sizet(size)) {
- giterr_set(GITERR_OS, "File size overflow for 32-bit systems");
+ if (!git__is_sizet(st.st_size)) {
+ giterr_set(GITERR_FILESYSTEM, "File size overflow for 32-bit systems");
return -1;
}
+ size = (size_t)st.st_size;
+
if (S_ISLNK(st.st_mode)) {
char *link_data;
ssize_t read_len;
GITERR_CHECK_ALLOC_ADD(size, 1);
- link_data = git__malloc((size_t)(size + 1));
+ link_data = git__malloc(size + 1);
GITERR_CHECK_ALLOC(link_data);
- read_len = p_readlink(path, link_data, (size_t)size);
+ read_len = p_readlink(path, link_data, size);
link_data[size] = '\0';
if (read_len != (ssize_t)size) {
giterr_set(GITERR_OS, "Failed to read symlink data for '%s'", path);
@@ -245,13 +245,13 @@ int git_odb__hashlink(git_oid *out, const char *path)
return -1;
}
- result = git_odb_hash(out, link_data, (size_t)size, GIT_OBJ_BLOB);
+ result = git_odb_hash(out, link_data, size, GIT_OBJ_BLOB);
git__free(link_data);
} else {
int fd = git_futils_open_ro(path);
if (fd < 0)
return -1;
- result = git_odb__hashfd(out, fd, (size_t)size, GIT_OBJ_BLOB);
+ result = git_odb__hashfd(out, fd, size, GIT_OBJ_BLOB);
p_close(fd);
}