summaryrefslogtreecommitdiff
path: root/sha1_file.c
diff options
context:
space:
mode:
authorJoey Hess <joey@kitenet.net>2008-11-20 13:56:28 -0500
committerJunio C Hamano <gitster@pobox.com>2008-11-27 18:48:53 -0800
commit65117abc040d95ef9877c3b14a24f4bc6aeaf4cb (patch)
treebcd3e9c86d1bbe25c17723c4fee8ba8959d7f430 /sha1_file.c
parent1510dbe380a24fdf303a3c0594752cfdc968cb12 (diff)
downloadgit-65117abc040d95ef9877c3b14a24f4bc6aeaf4cb.tar.gz
sha1_file: avoid bogus "file exists" error message
This avoids the following misleading error message: error: unable to create temporary sha1 filename ./objects/15: File exists mkstemp can fail for many reasons, one of which, ENOENT, can occur if the directory for the temp file doesn't exist. create_tmpfile tried to handle this case by always trying to mkdir the directory, even if it already existed. This caused errno to be clobbered, so one cannot tell why mkstemp really failed, and it truncated the buffer to just the directory name, resulting in the strange error message shown above. Note that in both occasions that I've seen this failure, it has not been due to a missing directory, or bad permissions, but some other, unknown mkstemp failure mode that did not occur when I ran git again. This code could perhaps be made more robust by retrying mkstemp, in case it was a transient failure. Signed-off-by: Joey Hess <joey@kitenet.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'sha1_file.c')
-rw-r--r--sha1_file.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/sha1_file.c b/sha1_file.c
index 12fc767ee5..1d7f3b6ce8 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -2220,7 +2220,7 @@ static int create_tmpfile(char *buffer, size_t bufsiz, const char *filename)
memcpy(buffer, filename, dirlen);
strcpy(buffer + dirlen, "tmp_obj_XXXXXX");
fd = mkstemp(buffer);
- if (fd < 0 && dirlen) {
+ if (fd < 0 && dirlen && errno == ENOENT) {
/* Make sure the directory exists */
memcpy(buffer, filename, dirlen);
buffer[dirlen-1] = 0;