summaryrefslogtreecommitdiff
path: root/src/filebuf.c
diff options
context:
space:
mode:
authorPaul Betts <paul@paulbetts.org>2012-02-23 17:11:20 -0800
committerPaul Betts <paul@paulbetts.org>2012-02-23 17:11:20 -0800
commit1db9d2c3bba2fe95280dca34bc04d261bd5d31f7 (patch)
treeb455b2365af8666d8a1f8ec73c4c4218ea07e534 /src/filebuf.c
parent34ab819ef923c3ff83be44b0c01373e65783b0ab (diff)
downloadlibgit2-1db9d2c3bba2fe95280dca34bc04d261bd5d31f7.tar.gz
Ensure that commits don't fail if committing content that already exists
Making a commit that results in a blob that already exists in the ODB (i.e. committing something, then making a revert commit) will result in us trying to p_rename -> MoveFileExW a temp file into the existing ODB entry. Despite the MOVEFILE_REPLACE_EXISTING flag is passed in, Win32 does not care and fails it with STATUS_ACCESS_DENIED. To fix this, we p_unlink the ODB entry before attempting to rename it. This call will typically fail, but we don't care, we'll let the p_rename fail if the file actually does exist and we couldn't delete it for some reason (ACLs, etc).
Diffstat (limited to 'src/filebuf.c')
-rw-r--r--src/filebuf.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/src/filebuf.c b/src/filebuf.c
index 418efc266..01df8e2d0 100644
--- a/src/filebuf.c
+++ b/src/filebuf.c
@@ -291,6 +291,8 @@ int git_filebuf_commit(git_filebuf *file, mode_t mode)
goto cleanup;
}
+ p_unlink(file->path_original);
+
error = p_rename(file->path_lock, file->path_original);
cleanup: