threads / discuss / 34611

About close() in commit_lock_file()

Subject: About close() in commit_lock_file()

## tl;dr

4 messages between Aug 5, 2013 and Aug 6, 2013.

replies: 3people: 3as markdown or json

Duy Nguyen· Aug 5, 2013, 14:23 UTC · lore

close() is added in commit_lock_file(), before rename(), by 4723ee9 (Close files opened by lock_file() before unlinking. - 2007-11-13), which is needed by Windows. But doesn't that create a gap between close() and rename() on other platforms where another process can replace .lock file with something else before rename() is executed? Should we enclose close() in #ifdef __MINGW32__ (and maybe __CYGWIN__)? -- Duy

Junio C Hamano· Aug 5, 2013, 16:56 UTC · re: Duy Nguyen · lore

Re: About close() in commit_lock_file()

Duy Nguyen <pclouds@gmail.com> writes:
Show 5 quoted lines
> close() is added in commit_lock_file(), before rename(), by 4723ee9
> (Close files opened by lock_file() before unlinking. - 2007-11-13),
> which is needed by Windows. But doesn't that create a gap between
> close() and rename() on other platforms where another process can
> replace .lock file with something else before rename() is executed?
Interesting.
> Should we enclose close() in #ifdef __MINGW32__ (and maybe
> __CYGWIN__)?

Or just have "close and retry" code after seeing rename() fails with some known errno, without singling out a particular platform?

Johannes Sixt· Aug 6, 2013, 06:41 UTC · re: Duy Nguyen · lore

Re: About close() in commit_lock_file()

Am 8/5/2013 16:23, schrieb Duy Nguyen:
Show 5 quoted lines
> close() is added in commit_lock_file(), before rename(), by 4723ee9
> (Close files opened by lock_file() before unlinking. - 2007-11-13),
> which is needed by Windows. But doesn't that create a gap between
> close() and rename() on other platforms where another process can
> replace .lock file with something else before rename() is executed?

First, files manipulated by commit_lock_file() are to be opened only using lock_file() by definition. Opening such a file in with open() or fopen() or renaming it via rename() without using the lockfile.[ch] API is possible regardless of whether commit_lock_file() has closed the file or not. Such manipulation is already undefined behavior (from Git's point of view), and there is nothing we can do about "misbehaving" processes.

Second, lock_file() uses O_CREAT|O_EXCL, which fails when the file exists, regardless of whether it is open or not.

Conclusion: There is no problem.
-- Hannes
Duy Nguyen· Aug 6, 2013, 08:36 UTC · re: Johannes Sixt · lore

Re: About close() in commit_lock_file()

On Tue, Aug 6, 2013 at 1:41 PM, Johannes Sixt <j.sixt@viscovery.net> wrote:
Show 16 quoted lines
> Am 8/5/2013 16:23, schrieb Duy Nguyen:
>> close() is added in commit_lock_file(), before rename(), by 4723ee9
>> (Close files opened by lock_file() before unlinking. - 2007-11-13),
>> which is needed by Windows. But doesn't that create a gap between
>> close() and rename() on other platforms where another process can
>> replace .lock file with something else before rename() is executed?
>
> First, files manipulated by commit_lock_file() are to be opened only using
> lock_file() by definition. Opening such a file in with open() or fopen()
> or renaming it via rename() without using the lockfile.[ch] API is
> possible regardless of whether commit_lock_file() has closed the file or
> not. Such manipulation is already undefined behavior (from Git's point of
> view), and there is nothing we can do about "misbehaving" processes.
>
> Second, lock_file() uses O_CREAT|O_EXCL, which fails when the file exists,
> regardless of whether it is open or not.

The second process could unlink(.lock file) first, then open it, even using lock_file(), but I think that falls into your "first" and is an invalid case from git point of view, so..

> Conclusion: There is no problem.
Agreed. False alarm.
-- 
Duy

← back to recent threads