aboutsummaryrefslogtreecommitdiff
path: root/sha1_file.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-12-29 00:30:01 -0800
committerJunio C Hamano <junkio@cox.net>2006-12-29 11:36:46 -0800
commit2c039da804ee0542ff41d2f22a444d04a2d37856 (patch)
tree8efd91254adfaa39b57e750f934e0127ee6352a5 /sha1_file.c
parent9c18df19073bad62e16d6b6b8e1939fd15424612 (diff)
downloadgit-2c039da804ee0542ff41d2f22a444d04a2d37856.tar.gz
git-2c039da804ee0542ff41d2f22a444d04a2d37856.tar.xz
mmap: set FD_CLOEXEC for file descriptors we keep open for mmap()
I do not have any proof that this matters to any existing problems I am seeing, but I do not think of any reason not to do this. Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'sha1_file.c')
-rw-r--r--sha1_file.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/sha1_file.c b/sha1_file.c
index 84037fe98..d9622d95e 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -540,6 +540,7 @@ static void open_packed_git(struct packed_git *p)
struct pack_header hdr;
unsigned char sha1[20];
unsigned char *idx_sha1;
+ long fd_flag;
p->pack_fd = open(p->pack_name, O_RDONLY);
if (p->pack_fd < 0 || fstat(p->pack_fd, &st))
@@ -553,6 +554,16 @@ static void open_packed_git(struct packed_git *p)
} else if (p->pack_size != st.st_size)
die("packfile %s size changed", p->pack_name);
+ /* We leave these file descriptors open with sliding mmap;
+ * there is no point keeping them open across exec(), though.
+ */
+ fd_flag = fcntl(p->pack_fd, F_GETFD, 0);
+ if (fd_flag < 0)
+ die("cannot determine file descriptor flags");
+ fd_flag |= FD_CLOEXEC;
+ if (fcntl(p->pack_fd, F_SETFD, fd_flag) == -1)
+ die("cannot set FD_CLOEXEC");
+
/* Verify we recognize this pack file format. */
read_or_die(p->pack_fd, &hdr, sizeof(hdr));
if (hdr.hdr_signature != htonl(PACK_SIGNATURE))