Files
git/builtin
Martin Ågren df60cf5789 read-cache: leave lock in right state in write_locked_index()
If the original version of `write_locked_index()` returned with an
error, it didn't roll back the lockfile unless the error occured at the
very end, during closing/committing. See commit 03b866477 (read-cache:
new API write_locked_index instead of write_index/write_cache,
2014-06-13).

In commit 9f41c7a6b (read-cache: close index.lock in do_write_index,
2017-04-26), we learned to close the lock slightly earlier in the
callstack. That was mostly a side-effect of lockfiles being implemented
using temporary files, but didn't cause any real harm.

Recently, commit 076aa2cbd (tempfile: auto-allocate tempfiles on heap,
2017-09-05) introduced a subtle bug. If the temporary file is deleted
(i.e., the lockfile is rolled back), the tempfile-pointer in the `struct
lock_file` will be left dangling. Thus, an attempt to reuse the
lockfile, or even just to roll it back, will induce undefined behavior
-- most likely a crash.

Besides not crashing, we clearly want to make things consistent. The
guarantees which the lockfile-machinery itself provides is A) if we ask
to commit and it fails, roll back, and B) if we ask to close and it
fails, do _not_ roll back. Let's do the same for consistency.

Do not delete the temporary file in `do_write_index()`. One of its
callers, `write_locked_index()` will thereby avoid rolling back the
lock. The other caller, `write_shared_index()`, will delete its
temporary file anyway. Both of these callers will avoid undefined
behavior (crashing).

Teach `write_locked_index(..., COMMIT_LOCK)` to roll back the lock
before returning. If we have already succeeded and committed, it will be
a noop. Simplify the existing callers where we now have a superfluous
call to `rollback_lockfile()`. That should keep future readers from
wondering why the callers are inconsistent.

Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-10-07 10:20:56 +09:00
..
2017-10-06 10:07:18 +09:00
2017-10-06 10:07:18 +09:00
2016-11-22 13:55:20 -08:00
2017-09-06 13:11:25 +09:00
2017-09-28 14:47:53 +09:00
2017-06-24 14:28:41 -07:00
2017-10-06 10:07:17 +09:00
2017-09-29 11:23:43 +09:00
2017-03-31 08:33:56 -07:00
2017-08-26 22:55:09 -07:00
2017-09-29 11:23:43 +09:00
2017-09-25 15:24:09 +09:00
2017-09-25 15:24:07 +09:00
2017-06-24 14:28:41 -07:00
2017-06-24 14:28:41 -07:00
2017-09-19 10:47:57 +09:00
2017-08-03 13:11:02 -07:00
2017-09-19 10:47:52 +09:00
2017-08-26 22:55:09 -07:00
2017-08-22 10:29:03 -07:00
2017-06-24 14:28:41 -07:00
2017-09-19 10:47:55 +09:00
2017-08-03 13:11:02 -07:00
2017-08-22 10:29:03 -07:00
2017-01-23 18:51:56 -08:00
2017-09-19 10:47:55 +09:00
2017-06-24 14:28:41 -07:00