summaryrefslogtreecommitdiff
path: root/sha1_file.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2015-06-11 16:29:55 (GMT)
committerJunio C Hamano <gitster@pobox.com>2015-06-11 16:29:55 (GMT)
commitdee47925c1d001947cf9a099e1cb883835f90c64 (patch)
tree43b49f39956a69276de2aa25c956868cc8ec675c /sha1_file.c
parent8f436d1374c7b8bd29118bd6344520dbaf83594b (diff)
parent9ca0aaf6de357d46916d81ca40c47886092fe610 (diff)
downloadgit-dee47925c1d001947cf9a099e1cb883835f90c64.zip
git-dee47925c1d001947cf9a099e1cb883835f90c64.tar.gz
git-dee47925c1d001947cf9a099e1cb883835f90c64.tar.bz2
Merge branch 'jk/diagnose-config-mmap-failure'
The configuration reader/writer uses mmap(2) interface to access the files; when we find a directory, it barfed with "Out of memory?". * jk/diagnose-config-mmap-failure: xmmap(): drop "Out of memory?" config.c: rewrite ENODEV into EISDIR when mmap fails config.c: avoid xmmap error messages config.c: fix mmap leak when writing config read-cache.c: drop PROT_WRITE from mmap of index
Diffstat (limited to 'sha1_file.c')
-rw-r--r--sha1_file.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/sha1_file.c b/sha1_file.c
index 7e38148..5038475 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -707,8 +707,8 @@ static void mmap_limit_check(size_t length)
(uintmax_t)length, (uintmax_t)limit);
}
-void *xmmap(void *start, size_t length,
- int prot, int flags, int fd, off_t offset)
+void *xmmap_gently(void *start, size_t length,
+ int prot, int flags, int fd, off_t offset)
{
void *ret;
@@ -719,12 +719,19 @@ void *xmmap(void *start, size_t length,
return NULL;
release_pack_memory(length);
ret = mmap(start, length, prot, flags, fd, offset);
- if (ret == MAP_FAILED)
- die_errno("Out of memory? mmap failed");
}
return ret;
}
+void *xmmap(void *start, size_t length,
+ int prot, int flags, int fd, off_t offset)
+{
+ void *ret = xmmap_gently(start, length, prot, flags, fd, offset);
+ if (ret == MAP_FAILED)
+ die_errno("mmap failed");
+ return ret;
+}
+
void close_pack_windows(struct packed_git *p)
{
while (p->windows) {