From: Patrick Steinhardt <ps@pks.im>
To: git@vger.kernel.org
Cc: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Subject: [PATCH 1/3] compat/mingw: share file handles created via `CreateFileW()`
Date: Wed, 23 Oct 2024 17:04:58 +0200 [thread overview]
Message-ID: <907576d23d1dc39b679a323e74b6bfb227d6c17d.1729695349.git.ps@pks.im> (raw)
In-Reply-To: <cover.1729695349.git.ps@pks.im>
Unless told otherwise, Windows will keep other processes from reading,
writing and deleting files when one has an open handle that was created
via `CreateFileW()`. This behaviour can be altered via `FILE_SHARE_*`
flags such that other processes _can_ read and/or modify such a file.
This sharing mechanism is quite important in the context of Git, as we
assume POSIX semantics all over the place.
There are two calls where we don't set up those flags though:
- We don't set `FILE_SHARE_DELETE` when creating a file for appending
via `mingw_open_append()`. This makes it impossible to delete the
file from another process or to replace it via an atomic rename.
- When opening a file such that we can change its access/modification
times. This makes it impossible to perform any kind of operation
on this file at all from another process. While we only open the
file for a short amount of time to update its timestamps, this still
opens us up for a race condition with another process.
Adapt both of these callsites to pass all three sharing flags.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
compat/mingw.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/compat/mingw.c b/compat/mingw.c
index 0e851ecae29..e326c6fcd2d 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -502,7 +502,7 @@ static int mingw_open_append(wchar_t const *wfilename, int oflags, ...)
* to append to the file.
*/
handle = CreateFileW(wfilename, FILE_APPEND_DATA,
- FILE_SHARE_WRITE | FILE_SHARE_READ,
+ FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
NULL, create, FILE_ATTRIBUTE_NORMAL, NULL);
if (handle == INVALID_HANDLE_VALUE) {
DWORD err = GetLastError();
@@ -1006,7 +1006,7 @@ int mingw_utime (const char *file_name, const struct utimbuf *times)
osfilehandle = CreateFileW(wfilename,
FILE_WRITE_ATTRIBUTES,
- 0 /*FileShare.None*/,
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
(attrs != INVALID_FILE_ATTRIBUTES &&
--
2.47.0.118.gfd3785337b.dirty
next prev parent reply other threads:[~2024-10-23 15:05 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-23 15:04 [PATCH 0/3] compat/mingw: implement POSIX-style atomic renames Patrick Steinhardt
2024-10-23 15:04 ` Patrick Steinhardt [this message]
2024-10-23 16:18 ` [PATCH 1/3] compat/mingw: share file handles created via `CreateFileW()` Kristoffer Haugsbakk
2024-10-23 17:25 ` Taylor Blau
2024-10-23 17:23 ` Taylor Blau
2024-10-23 17:25 ` Taylor Blau
2024-10-24 6:30 ` Patrick Steinhardt
2024-10-27 13:14 ` Johannes Sixt
2024-10-27 23:46 ` Taylor Blau
2024-10-23 15:05 ` [PATCH 2/3] compat/mingw: allow deletion of most opened files Patrick Steinhardt
2024-10-23 16:17 ` Kristoffer Haugsbakk
2024-10-23 17:30 ` Taylor Blau
2024-10-24 6:30 ` Patrick Steinhardt
2024-10-23 18:07 ` Taylor Blau
2024-10-23 15:05 ` [PATCH 3/3] compat/mingw: support POSIX semantics for atomic renames Patrick Steinhardt
2024-10-23 16:19 ` Kristoffer Haugsbakk
2024-10-24 6:30 ` Patrick Steinhardt
2024-10-24 7:18 ` Kristoffer Haugsbakk
2024-10-24 7:20 ` Patrick Steinhardt
2024-10-23 18:30 ` Taylor Blau
2024-10-23 15:36 ` [PATCH 0/3] compat/mingw: implement POSIX-style " Taylor Blau
2024-10-24 11:46 ` [PATCH v2 " Patrick Steinhardt
2024-10-24 11:46 ` [PATCH v2 1/3] compat/mingw: share file handles created via `CreateFileW()` Patrick Steinhardt
2024-10-24 11:46 ` [PATCH v2 2/3] compat/mingw: allow deletion of most opened files Patrick Steinhardt
2024-10-27 13:17 ` Johannes Sixt
2024-10-27 15:38 ` Patrick Steinhardt
2024-10-27 23:48 ` Taylor Blau
2024-10-27 23:51 ` Taylor Blau
2024-10-24 11:46 ` [PATCH v2 3/3] compat/mingw: support POSIX semantics for atomic renames Patrick Steinhardt
2024-10-27 13:23 ` Johannes Sixt
2024-10-27 15:38 ` Patrick Steinhardt
2024-10-27 16:31 ` Johannes Sixt
2024-10-27 17:27 ` Patrick Steinhardt
2024-10-27 21:36 ` Johannes Sixt
2024-10-27 23:50 ` Taylor Blau
2024-10-24 16:47 ` [PATCH v2 0/3] compat/mingw: implement POSIX-style " Taylor Blau
2024-10-27 13:27 ` Johannes Sixt
2024-10-27 15:39 ` [PATCH v3 " Patrick Steinhardt
2024-10-27 15:39 ` [PATCH v3 1/3] compat/mingw: share file handles created via `CreateFileW()` Patrick Steinhardt
2024-10-27 15:39 ` [PATCH v3 2/3] compat/mingw: allow deletion of most opened files Patrick Steinhardt
2024-10-27 15:39 ` [PATCH v3 3/3] compat/mingw: support POSIX semantics for atomic renames Patrick Steinhardt
2024-11-06 3:54 ` [PATCH v3 0/3] compat/mingw: implement POSIX-style " Junio C Hamano
2024-11-06 6:44 ` Johannes Sixt
2024-11-06 12:09 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=907576d23d1dc39b679a323e74b6bfb227d6c17d.1729695349.git.ps@pks.im \
--to=ps@pks.im \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).