Re: [PATCH] sha1_file: don't convert off_t to size_t too early to avoid potential die()
From: Junio C Hamano <hidden>
Date: 2016-06-15 23:02:34
Steffen Prohaska [off-list ref] writes:
This patch should be applied on top of sp/stream-clean-filter.
... or it can be squashed in as a fix, as the topic is not yet in 'next'.
quoted hunk
index_stream() might internally also be able to handle large files to some extent. But it uses size_t for its third argument, and we must already die() when calling it. It might be a good idea to convert its interface to use off_t and push the size checks further down the stack. In general, it might be good idea to carefully consider whether to use off_t or size_t when passing file-related sizes around. To me it looks like a separate issue for a separate patch series (I have no specific plans to prepare one). sha1_file.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)diff --git a/sha1_file.c b/sha1_file.c index 5b0e67a..6f18c22 100644 --- a/sha1_file.c +++ b/sha1_file.c@@ -3180,17 +3180,22 @@ int index_fd(unsigned char *sha1, int fd, struct stat *st, enum object_type type, const char *path, unsigned flags) { int ret; - size_t size = xsize_t(st->st_size); + /* + * Call xsize_t() only when needed to avoid potentially unnecessary + * die() for large files. + */ if (type == OBJ_BLOB && path && would_convert_to_git_filter_fd(path)) ret = index_stream_convert_blob(sha1, fd, path, flags); else if (!S_ISREG(st->st_mode)) ret = index_pipe(sha1, fd, type, path, flags); - else if (size <= big_file_threshold || type != OBJ_BLOB || + else if (st->st_size <= big_file_threshold || type != OBJ_BLOB || (path && would_convert_to_git(path))) - ret = index_core(sha1, fd, size, type, path, flags); + ret = index_core(sha1, fd, xsize_t(st->st_size), type, path, + flags); else - ret = index_stream(sha1, fd, size, type, path, flags); + ret = index_stream(sha1, fd, xsize_t(st->st_size), type, path, + flags); close(fd); return ret; }