diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-06-10 18:47:18 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-06-10 22:23:18 -0700 |
commit | e9039dd35194b7c1cf4ecd479928638166b8458f (patch) | |
tree | 546d1c2b4abc77de3b97eb0339afc33ea074ff6a | |
parent | cdf222f5f0d6f2f22df12e83c4a1f9aae35f3084 (diff) | |
download | git-e9039dd35194b7c1cf4ecd479928638166b8458f.tar.gz git-e9039dd35194b7c1cf4ecd479928638166b8458f.tar.xz |
Consolidate SHA1 object file close
This consolidates the common operations for closing the new temporary file
that we have written, before we move it into place with the final name.
There's some common code there (make it read-only and check for errors on
close), but more importantly, this also gives a single place to add an
fsync_or_die() call if we want to add a safe mode.
This was triggered due to Denis Bueno apparently twice being able to
corrupt his git repository on OS X due to an unlucky combination of kernel
crashes and a not-very-robust filesystem.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | sha1_file.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/sha1_file.c b/sha1_file.c index adcf37c3f..f311c79e5 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -2105,6 +2105,15 @@ int hash_sha1_file(const void *buf, unsigned long len, const char *type, return 0; } +/* Finalize a file on disk, and close it. */ +static void close_sha1_file(int fd) +{ + /* For safe-mode, we could fsync_or_die(fd, "sha1 file") here */ + fchmod(fd, 0444); + if (close(fd) != 0) + die("unable to write sha1 file"); +} + static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen, void *buf, unsigned long len, time_t mtime) { @@ -2170,9 +2179,7 @@ static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen, if (write_buffer(fd, compressed, size) < 0) die("unable to write sha1 file"); - fchmod(fd, 0444); - if (close(fd)) - die("unable to write sha1 file"); + close_sha1_file(fd); free(compressed); if (mtime) { @@ -2350,9 +2357,7 @@ int write_sha1_from_fd(const unsigned char *sha1, int fd, char *buffer, } while (1); inflateEnd(&stream); - fchmod(local, 0444); - if (close(local) != 0) - die("unable to write sha1 file"); + close_sha1_file(local); SHA1_Final(real_sha1, &c); if (ret != Z_STREAM_END) { unlink(tmpfile); |