git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 0/2] Correctly handle transient files in shared repositories

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Jan 6, 2016, 13:09 UTC
Message-ID
<cover.1452085713.git.johannes.schindelin@gmx.de>
In-Reply-To
<4aa11f02f4de113bf38152b8815658da42690f43.1450549280.git.johannes.schindelin@gmx.de>

Transient files, e.g. commit messages, are writable only by the owner, even in shared repositories, to avoid interference between competing users working on the same files.

These files are typically not deleted after use. As a consequence, we have to delete such files before writing when they are owned by someone else than the current user.

Reported-by: Yaroslav Halchenko <yoh@onerussian.com>
Johannes Schindelin (2):
  commit: allow editing the commit message even in shared repos
  Handle more file writes correctly in shared repos
 builtin/commit.c      |  2 +-
 builtin/fast-export.c |  2 +-
 builtin/fetch.c       |  2 +-
 git-compat-util.h     |  1 +
 wrapper.c             | 13 +++++++++++++
 5 files changed, 17 insertions(+), 3 deletions(-)
Interdiff vs v1:
 diff --git a/builtin/commit.c b/builtin/commit.c
 index 3bfd457..89bf6ad 100644
 --- a/builtin/commit.c
 +++ b/builtin/commit.c
 @@ -761,7 +761,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
  		hook_arg2 = "";
  	}
  
 -	s->fp = fopen(git_path(commit_editmsg), "w");
 +	s->fp = fopen_for_writing(git_path(commit_editmsg));
  	if (s->fp == NULL)
  		die_errno(_("could not open '%s'"), git_path(commit_editmsg));
  
 @@ -905,7 +905,6 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
  	strbuf_release(&committer_ident);
  
  	fclose(s->fp);
 -	adjust_shared_perm(git_path(commit_editmsg));
  
  	/*
  	 * Reject an attempt to record a non-merge empty commit without
 diff --git a/builtin/fast-export.c b/builtin/fast-export.c
 index d9ac5d8..2471297 100644
 --- a/builtin/fast-export.c
 +++ b/builtin/fast-export.c
 @@ -880,7 +880,7 @@ static void export_marks(char *file)
  	FILE *f;
  	int e = 0;
  
 -	f = fopen(file, "w");
 +	f = fopen_for_writing(file);
  	if (!f)
  		die_errno("Unable to open marks file %s for writing.", file);
  
 diff --git a/builtin/fetch.c b/builtin/fetch.c
 index 586840d..33f04c1 100644
 --- a/builtin/fetch.c
 +++ b/builtin/fetch.c
 @@ -840,7 +840,7 @@ static void check_not_current_branch(struct ref *ref_map)
  static int truncate_fetch_head(void)
  {
  	const char *filename = git_path_fetch_head();
 -	FILE *fp = fopen(filename, "w");
 +	FILE *fp = fopen_for_writing(filename);
  
  	if (!fp)
  		return error(_("cannot open %s: %s\n"), filename, strerror(errno));
 diff --git a/git-compat-util.h b/git-compat-util.h
 index 2da0a75..e8f2867 100644
 --- a/git-compat-util.h
 +++ b/git-compat-util.h
 @@ -733,6 +733,7 @@ extern int xmkstemp_mode(char *template, int mode);
  extern int odb_mkstemp(char *template, size_t limit, const char *pattern);
  extern int odb_pack_keep(char *name, size_t namesz, const unsigned char *sha1);
  extern char *xgetcwd(void);
 +extern FILE *fopen_for_writing(const char *path);
  
  #define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), (alloc) * sizeof(*(x)))
  
 diff --git a/wrapper.c b/wrapper.c
 index b43d437..29a45d2 100644
 --- a/wrapper.c
 +++ b/wrapper.c
 @@ -391,6 +391,19 @@ FILE *xfdopen(int fd, const char *mode)
  	return stream;
  }
  
 +FILE *fopen_for_writing(const char *path)
 +{
 +	FILE *ret = fopen(path, "w");
 +
 +	if (!ret && errno == EPERM) {
 +		if (!unlink(path))
 +			ret = fopen(path, "w");
 +		else
 +			errno = EPERM;
 +	}
 +	return ret;
 +}
 +
  int xmkstemp(char *template)
  {
  	int fd;
-- 
2.6.3.windows.1.300.g1c25e49
Previous: Johannes SchindelinNext: Johannes Schindelin
Message 23 of 45 in “commit: ensure correct permissions of the commit message”
  1. commit: ensure correct permissions of the commit messageJohannes Schindelin, Dec 19, 2015
  2. Jeff KingDec 20, 2015
  3. Johannes SchindelinDec 20, 2015
  4. Torsten BögershausenDec 20, 2015
  5. Johannes SchindelinDec 30, 2015
  6. Junio C HamanoDec 21, 2015
  7. Jeff KingDec 21, 2015
  8. Junio C HamanoDec 21, 2015
  9. Johannes SchindelinDec 30, 2015
  10. Junio C HamanoDec 30, 2015
  11. Johannes SchindelinJan 1, 2016
  12. Junio C HamanoJan 4, 2016
  13. Johannes SchindelinJan 5, 2016
  14. Junio C HamanoJan 5, 2016
  15. Johannes SchindelinJan 6, 2016
  16. Jeff KingJan 6, 2016
  17. Johannes SchindelinJan 6, 2016
  18. SZEDER GáborJan 15, 2016
  19. Junio C HamanoJan 15, 2016
  20. Johannes SchindelinJan 15, 2016
  21. SZEDER GáborJan 15, 2016
  22. Johannes SchindelinJan 15, 2016
  23. 0/2 Correctly handle transient files in shared repositoriesJohannes Schindelin, Jan 6, 2016
  24. 1/2 commit: allow editing the commit message even in shared reposJohannes Schindelin, Jan 6, 2016
  25. Jeff KingJan 7, 2016
  26. Junio C HamanoJan 7, 2016
  27. 2/2 Handle more file writes correctly in shared reposJohannes Schindelin, Jan 6, 2016
  28. Jeff KingJan 7, 2016
  29. Johannes SchindelinJan 8, 2016
  30. Junio C HamanoJan 7, 2016
  31. Johannes SchindelinJan 8, 2016
  32. Junio C HamanoJan 8, 2016
  33. Johannes SchindelinJan 11, 2016
  34. Junio C HamanoJan 11, 2016
  35. Junio C HamanoJan 11, 2016
  36. 0/2 Correctly handle transient files in shared repositoriesJohannes Schindelin, Jan 11, 2016
  37. 1/2 commit: allow editing the commit message even in shared reposJohannes Schindelin, Jan 11, 2016
  38. 2/2 Handle more file writes correctly in shared reposJohannes Schindelin, Jan 11, 2016
  39. Jeff KingJan 11, 2016
  40. Junio C HamanoJan 11, 2016
  41. Junio C HamanoJan 11, 2016
  42. Jeff KingJan 11, 2016
  43. Junio C HamanoJan 11, 2016
  44. Jeff KingJan 11, 2016
  45. Johannes SchindelinJan 12, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.