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

[PATCH v1 1/2] entry.c: update cache entry only for existing files

From
lars.schneider@autodesk.com <lars.schneider@autodesk.com>
Date
Oct 5, 2017, 10:44 UTC
Message-ID
<20171005104407.65948-2-lars.schneider@autodesk.com>
In-Reply-To
<20171005104407.65948-1-lars.schneider@autodesk.com>
From: Lars Schneider <larsxschneider@gmail.com>

In 2841e8f ("convert: add "status=delayed" to filter process protocol", 2017-06-30) we taught the filter process protocol to delay responses.

That means an external filter might answer in the first write_entry() call on a file that requires filtering "I got your request, but I can't answer right now. Ask again later!". As Git got no answer, we do not write anything to the filesystem. Consequently, the lstat() call in the finish block of the function writes garbage to the cache entry. The garbage is eventually overwritten when the filter answers with the final file content in a subsequent write_entry() call.

Fix the brief time window of garbage in the cache entry by adding a special finish block that does nothing for delayed responses. The cache entry is written properly in a subsequent write_entry() call where the filter responds with the final file content.

Reported-by: Jeff King <peff@peff.net>
Signed-off-by: Lars Schneider <larsxschneider@gmail.com>
---
 entry.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/entry.c b/entry.c
index 1c7e3c11d5..5dab656364 100644
--- a/entry.c
+++ b/entry.c
@@ -304,7 +304,7 @@ static int write_entry(struct cache_entry *ce,
 					ce->name, new, size, &buf, dco);
 				if (ret && string_list_has_string(&dco->paths, ce->name)) {
 					free(new);
-					goto finish;
+					goto delayed;
 				}
 			} else
 				ret = convert_to_working_tree(
@@ -360,6 +360,7 @@ static int write_entry(struct cache_entry *ce,
 		ce->ce_flags |= CE_UPDATE_IN_BASE;
 		state->istate->cache_changed |= CE_ENTRY_CHANGED;
 	}
+delayed:
 	return 0;
 }
 
-- 
2.14.2
Previous: Lars SchneiderNext: Jeff King
Message 10 of 26 in “fix temporary garbage in the cache entry”
  1. 0/2 fix temporary garbage in the cache entrylars.schneider@autodesk.com, Oct 5, 2017
  2. 2/2 entry.c: check if file exists after checkoutlars.schneider@autodesk.com, Oct 5, 2017
  3. Jeff KingOct 5, 2017
  4. Junio C HamanoOct 6, 2017
  5. Jeff KingOct 6, 2017
  6. Junio C HamanoOct 6, 2017
  7. Jeff KingOct 6, 2017
  8. Junio C HamanoOct 6, 2017
  9. Lars SchneiderOct 8, 2017
  10. 1/2 entry.c: update cache entry only for existing fileslars.schneider@autodesk.com, Oct 5, 2017
  11. Jeff KingOct 5, 2017
  12. Junio C HamanoOct 5, 2017
  13. Jeff KingOct 5, 2017
  14. Junio C HamanoOct 5, 2017
  15. Jeff KingOct 6, 2017
  16. Lars SchneiderOct 8, 2017
  17. Jeff KingOct 9, 2017
  18. 1/3 write_entry: fix leak when retrying delayed filterJeff King, Oct 9, 2017
  19. Junio C HamanoOct 10, 2017
  20. Simon RuderichOct 10, 2017
  21. Jeff KingOct 10, 2017
  22. Simon RuderichOct 10, 2017
  23. 2/3 write_entry: avoid reading blobs in CE_RETRY caseJeff King, Oct 9, 2017
  24. Junio C HamanoOct 10, 2017
  25. 3/3 write_entry: untangle symlink and regular-file casesJeff King, Oct 9, 2017
  26. Junio C HamanoOct 10, 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.