From 63e625853f148e1ffef36cd33e5d5796be94fbd5 Mon Sep 17 00:00:00 2001 From: Ben Wijen Date: Thu, 19 May 2016 07:27:54 +0200 Subject: [PATCH] Make sure temporary file handles are not inherited by child processes When testing a merge driver which spawns a merge server (for future merges) I got the following error: Rename from 'xxx/.git/index.lock' to 'xxx/.git/index' failed. Should I try again? (y/n) Only after I stop the merge server the lock is released. This is caused by windows handle inheritance. Starting childs with bInheritHandles==FALSE does not work, because no file handles would be inherited, not even the hStdXxx handles in STARTUPINFO. Opening every file with O_NOINHERIT does not work, Since it is used by git-upload-pack for example, which expects inherited handles. This leaves us with only creating temp files with the O_NOINHERIT flag. Which (currently) only used by lock_file which is exactly what we want. Signed-off-by: Ben Wijen --- compat/mingw.h | 4 ++++ tempfile.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/compat/mingw.h b/compat/mingw.h index ef22cbb05d..6090e83947 100644 --- a/compat/mingw.h +++ b/compat/mingw.h @@ -67,6 +67,10 @@ typedef int pid_t; #define F_SETFD 2 #define FD_CLOEXEC 0x1 +#if !defined O_CLOEXEC && defined O_NOINHERIT +#define O_CLOEXEC O_NOINHERIT +#endif + #ifndef EAFNOSUPPORT #define EAFNOSUPPORT WSAEAFNOSUPPORT #endif diff --git a/tempfile.c b/tempfile.c index 0af7ebf016..db3981deab 100644 --- a/tempfile.c +++ b/tempfile.c @@ -120,7 +120,7 @@ int create_tempfile(struct tempfile *tempfile, const char *path) prepare_tempfile_object(tempfile); strbuf_add_absolute_path(&tempfile->filename, path); - tempfile->fd = open(tempfile->filename.buf, O_RDWR | O_CREAT | O_EXCL, 0666); + tempfile->fd = open(tempfile->filename.buf, O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC, 0666); if (tempfile->fd < 0) { strbuf_reset(&tempfile->filename); return -1;