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

[PATCH v4 21/23] try_remove_empty_parents(): don't trash argument contents

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Jan 6, 2017, 16:22 UTC
Message-ID
<0bbc4f8f99c5915037e0f743c2f442988b91c7bd.1483719289.git.mhagger@alum.mit.edu>
In-Reply-To
<cover.1483719289.git.mhagger@alum.mit.edu>
It's bad manners and surprising and therefore error-prone.
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 refs/files-backend.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 92a9d99..88f8c7a 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -2282,13 +2282,15 @@ static int pack_if_possible_fn(struct ref_entry *entry, void *cb_data)
 
 /*
  * Remove empty parents, but spare refs/ and immediate subdirs.
- * Note: munges *refname.
  */
-static void try_remove_empty_parents(char *refname)
+static void try_remove_empty_parents(const char *refname)
 {
+	struct strbuf buf = STRBUF_INIT;
 	char *p, *q;
 	int i;
-	p = refname;
+
+	strbuf_addstr(&buf, refname);
+	p = buf.buf;
 	for (i = 0; i < 2; i++) { /* refs/{heads,tags,...}/ */
 		while (*p && *p != '/')
 			p++;
@@ -2296,8 +2298,7 @@ static void try_remove_empty_parents(char *refname)
 		while (*p == '/')
 			p++;
 	}
-	for (q = p; *q; q++)
-		;
+	q = buf.buf + buf.len;
 	while (1) {
 		while (q > p && *q != '/')
 			q--;
@@ -2305,10 +2306,11 @@ static void try_remove_empty_parents(char *refname)
 			q--;
 		if (q == p)
 			break;
-		*q = '\0';
-		if (rmdir(git_path("%s", refname)))
+		strbuf_setlen(&buf, q - buf.buf);
+		if (rmdir(git_path("%s", buf.buf)))
 			break;
 	}
+	strbuf_release(&buf);
 }
 
 /* make sure nobody touched the ref, and unlink */
-- 
2.9.3
Previous: Michael HaggertyNext: Michael Haggerty
Message 18 of 25 in “Delete directories left empty after ref deletion”
  1. 00/23 Delete directories left empty after ref deletionMichael Haggerty, Jan 6, 2017
  2. 01/23 files_rename_ref(): tidy up whitespaceMichael Haggerty, Jan 6, 2017
  3. 03/23 t5505: use "for-each-ref" to test for the non-existence of referencesMichael Haggerty, Jan 6, 2017
  4. 06/23 raceproof_create_file(): new functionMichael Haggerty, Jan 6, 2017
  5. 02/23 refname_is_safe(): correct docstringMichael Haggerty, Jan 6, 2017
  6. 05/23 safe_create_leading_directories(): set errno on SCLD_EXISTSMichael Haggerty, Jan 6, 2017
  7. 10/23 rename_tmp_log(): improve error reportingMichael Haggerty, Jan 6, 2017
  8. 09/23 rename_tmp_log(): use raceproof_create_file()Michael Haggerty, Jan 6, 2017
  9. 04/23 safe_create_leading_directories_const(): preserve errnoMichael Haggerty, Jan 6, 2017
  10. 07/23 lock_ref_sha1_basic(): inline constantMichael Haggerty, Jan 6, 2017
  11. 13/23 log_ref_setup(): improve robustness against racesMichael Haggerty, Jan 6, 2017
  12. 08/23 lock_ref_sha1_basic(): use raceproof_create_file()Michael Haggerty, Jan 6, 2017
  13. 11/23 log_ref_write(): inline functionMichael Haggerty, Jan 6, 2017
  14. 23/23 files_transaction_commit(): clean up empty directoriesMichael Haggerty, Jan 6, 2017
  15. 18/23 delete_ref_loose(): derive loose reference path from lockMichael Haggerty, Jan 6, 2017
  16. 19/23 delete_ref_loose(): inline functionMichael Haggerty, Jan 6, 2017
  17. 22/23 try_remove_empty_parents(): teach to remove parents of reflogs, tooMichael Haggerty, Jan 6, 2017
  18. 21/23 try_remove_empty_parents(): don't trash argument contentsMichael Haggerty, Jan 6, 2017
  19. 20/23 try_remove_empty_parents(): rename parameter "name" -> "refname"Michael Haggerty, Jan 6, 2017
  20. 16/23 log_ref_setup(): manage the name of the reflog file internallyMichael Haggerty, Jan 6, 2017
  21. 12/23 log_ref_setup(): separate code for create vs non-createMichael Haggerty, Jan 6, 2017
  22. 15/23 log_ref_write_1(): don't depend on logfile argumentMichael Haggerty, Jan 6, 2017
  23. 17/23 log_ref_write_1(): inline functionMichael Haggerty, Jan 6, 2017
  24. 14/23 log_ref_setup(): pass the open file descriptor back to the callerMichael Haggerty, Jan 6, 2017
  25. Jeff KingJan 6, 2017

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.