Commit 69adb781 by Edward Thomson

Merge pull request #3325 from libgit2/cmn/filebuf-rename-error

 filebuf: remove lockfile upon rename errors
parents 0dd8daea 19d9beb7
...@@ -101,7 +101,7 @@ void git_filebuf_cleanup(git_filebuf *file) ...@@ -101,7 +101,7 @@ void git_filebuf_cleanup(git_filebuf *file)
if (file->fd_is_open && file->fd >= 0) if (file->fd_is_open && file->fd >= 0)
p_close(file->fd); p_close(file->fd);
if (file->fd_is_open && file->path_lock && git_path_exists(file->path_lock)) if (file->created_lock && !file->did_rename && file->path_lock && git_path_exists(file->path_lock))
p_unlink(file->path_lock); p_unlink(file->path_lock);
if (file->compute_digest) { if (file->compute_digest) {
...@@ -258,6 +258,7 @@ int git_filebuf_open(git_filebuf *file, const char *path, int flags, mode_t mode ...@@ -258,6 +258,7 @@ int git_filebuf_open(git_filebuf *file, const char *path, int flags, mode_t mode
goto cleanup; goto cleanup;
} }
file->fd_is_open = true; file->fd_is_open = true;
file->created_lock = true;
/* No original path */ /* No original path */
file->path_original = NULL; file->path_original = NULL;
...@@ -281,6 +282,8 @@ int git_filebuf_open(git_filebuf *file, const char *path, int flags, mode_t mode ...@@ -281,6 +282,8 @@ int git_filebuf_open(git_filebuf *file, const char *path, int flags, mode_t mode
/* open the file for locking */ /* open the file for locking */
if ((error = lock_file(file, flags, mode)) < 0) if ((error = lock_file(file, flags, mode)) < 0)
goto cleanup; goto cleanup;
file->created_lock = true;
} }
return 0; return 0;
...@@ -340,6 +343,8 @@ int git_filebuf_commit(git_filebuf *file) ...@@ -340,6 +343,8 @@ int git_filebuf_commit(git_filebuf *file)
goto on_error; goto on_error;
} }
file->did_rename = true;
git_filebuf_cleanup(file); git_filebuf_cleanup(file);
return 0; return 0;
......
...@@ -44,6 +44,8 @@ struct git_filebuf { ...@@ -44,6 +44,8 @@ struct git_filebuf {
size_t buf_size, buf_pos; size_t buf_size, buf_pos;
git_file fd; git_file fd;
bool fd_is_open; bool fd_is_open;
bool created_lock;
bool did_rename;
bool do_not_buffer; bool do_not_buffer;
int last_error; int last_error;
}; };
......
...@@ -124,3 +124,30 @@ void test_core_filebuf__umask(void) ...@@ -124,3 +124,30 @@ void test_core_filebuf__umask(void)
cl_must_pass(p_unlink(test)); cl_must_pass(p_unlink(test));
} }
void test_core_filebuf__rename_error(void)
{
git_filebuf file = GIT_FILEBUF_INIT;
char *dir = "subdir", *test = "subdir/test", *test_lock = "subdir/test.lock";
int fd;
#ifndef GIT_WIN32
cl_skip();
#endif
cl_git_pass(p_mkdir(dir, 0666));
cl_git_mkfile(test, "dummy content");
fd = p_open(test, O_RDONLY);
cl_assert(fd > 0);
cl_git_pass(git_filebuf_open(&file, test, 0, 0666));
cl_git_pass(git_filebuf_printf(&file, "%s\n", "libgit2 rocks"));
cl_assert_equal_i(true, git_path_exists(test_lock));
cl_git_fail(git_filebuf_commit(&file));
p_close(fd);
git_filebuf_cleanup(&file);
cl_assert_equal_i(false, git_path_exists(test_lock));
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment