# About close() in commit_lock_file()

4 messages from 2013-08-05 to 2013-08-06. Participants: Duy Nguyen, Junio C Hamano, Johannes Sixt.
Thread: https://gitlist.dev/t/34611

## Duy Nguyen, 2013-08-05 14:23

Subject: About close() in commit_lock_file()
Message-ID: <CACsJy8By1cpPZ5QyVd6VhKSkd-y_E6pTYdDimK9P0wXia-uMqg@mail.gmail.com>
URL: https://gitlist.dev/e/CACsJy8By1cpPZ5QyVd6VhKSkd-y_E6pTYdDimK9P0wXia-uMqg%40mail.gmail.com

```
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, 2013-08-05 16:56

Subject: Re: About close() in commit_lock_file()
Message-ID: <7vli4gkrf0.fsf@alter.siamese.dyndns.org>
URL: https://gitlist.dev/e/7vli4gkrf0.fsf%40alter.siamese.dyndns.org
In-Reply-To: <CACsJy8By1cpPZ5QyVd6VhKSkd-y_E6pTYdDimK9P0wXia-uMqg@mail.gmail.com>

```
Duy Nguyen <pclouds@gmail.com> writes:

> 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, 2013-08-06 06:41

Subject: Re: About close() in commit_lock_file()
Message-ID: <52009A90.7050701@viscovery.net>
URL: https://gitlist.dev/e/52009A90.7050701%40viscovery.net
In-Reply-To: <CACsJy8By1cpPZ5QyVd6VhKSkd-y_E6pTYdDimK9P0wXia-uMqg@mail.gmail.com>

```
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.

Conclusion: There is no problem.

-- Hannes

```

## Duy Nguyen, 2013-08-06 08:36

Subject: Re: About close() in commit_lock_file()
Message-ID: <CACsJy8DquJj1qVawKfrbZY+2WLC54Gskizs1sxZ_j1yutBkbdA@mail.gmail.com>
URL: https://gitlist.dev/e/CACsJy8DquJj1qVawKfrbZY%2B2WLC54Gskizs1sxZ_j1yutBkbdA%40mail.gmail.com
In-Reply-To: <52009A90.7050701@viscovery.net>

```
On Tue, Aug 6, 2013 at 1:41 PM, Johannes Sixt <j.sixt@viscovery.net> wrote:
> 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

```
