From a198eb7600a4fa2256355df18db5f1f5b8e43dd7 Mon Sep 17 00:00:00 2001 From: Steffen Prohaska Date: Fri, 22 Aug 2014 16:01:21 +0200 Subject: [PATCH] sha1_file.c: introduce GIT_MMAP_LIMIT to limit mmap size Similar to testing expectations about malloc with GIT_ALLOC_LIMIT introduced in d41489a6 (Add more large blob test cases, 2012-03-07), it can be useful to test expectations about mmap. Introduce a new environment variable GIT_MMAP_LIMIT to limit the largest allowed mmap length (in KB). xmmap() is modified to check the limit. Together with GIT_ALLOC_LIMIT tests can now easily confirm expectations about memory consumption. GIT_MMAP_LIMIT will be used in the next commit to test that data will be streamed to an external filter without mmaping the entire file. Signed-off-by: Steffen Prohaska Signed-off-by: Junio C Hamano --- sha1_file.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/sha1_file.c b/sha1_file.c index 00c07f233b..603673b1cc 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -663,10 +663,25 @@ void release_pack_memory(size_t need) ; /* nothing */ } +static void mmap_limit_check(size_t length) +{ + static ssize_t limit = -1; + if (limit == -1) { + const char *env = getenv("GIT_MMAP_LIMIT"); + limit = env ? atol(env) * 1024 : 0; + } + if (limit && length > limit) + die("attempting to mmap %"PRIuMAX" over limit %"PRIuMAX, + (uintmax_t)length, (uintmax_t)limit); +} + void *xmmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) { - void *ret = mmap(start, length, prot, flags, fd, offset); + void *ret; + + mmap_limit_check(length); + ret = mmap(start, length, prot, flags, fd, offset); if (ret == MAP_FAILED) { if (!length) return NULL; -- 2.11.4.GIT