@matheusbsbs / matheus-bagliano / commits / e9039dd351
Fork 0

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>

Linus Torvalds committed Jun 10, 2008 at 18:47 UTC e9039dd35194b7c1cf4ecd479928638166b8458f
1 file changed +11 -6
sha1_file.c
+11 -6
@@ -2105,6 +2105,15 @@ int hash_sha1_file(const void *buf, unsigned long len, const char *type,
2105 return 0;
2106 }
2107
2108 +/* Finalize a file on disk, and close it. */
2109 +static void close_sha1_file(int fd)
2110 +{
2111 + /* For safe-mode, we could fsync_or_die(fd, "sha1 file") here */
2112 + fchmod(fd, 0444);
2113 + if (close(fd) != 0)
2114 + die("unable to write sha1 file");
2115 +}
2116 +
2117 static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen,
2118 void *buf, unsigned long len, time_t mtime)
2119 {
@@ -2170,9 +2179,7 @@ static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen,
2179
2180 if (write_buffer(fd, compressed, size) < 0)
2181 die("unable to write sha1 file");
2173 - fchmod(fd, 0444);
2174 - if (close(fd))
2175 - die("unable to write sha1 file");
2182 + close_sha1_file(fd);
2183 free(compressed);
2184
2185 if (mtime) {
@@ -2350,9 +2357,7 @@ int write_sha1_from_fd(const unsigned char *sha1, int fd, char *buffer,
2357 } while (1);
2358 inflateEnd(&stream);
2359
2353 - fchmod(local, 0444);
2354 - if (close(local) != 0)
2355 - die("unable to write sha1 file");
2360 + close_sha1_file(local);
2361 SHA1_Final(real_sha1, &c);
2362 if (ret != Z_STREAM_END) {
2363 unlink(tmpfile);