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

[PATCH v4 15/15] fetch-pack: restore save_commit_buffer after use

From
JHJeff Hostetler <git@jeffhostetler.com>
Date
Nov 16, 2017, 18:17 UTC
Message-ID
<20171116181723.62033-16-git@jeffhostetler.com>
In-Reply-To
<20171116181723.62033-1-git@jeffhostetler.com>
From: Jonathan Tan <jonathantanmy@google.com>

In fetch-pack, the global variable save_commit_buffer is set to 0, but not restored to its original value after use.

In particular, if show_log() (in log-tree.c) is invoked after fetch_pack() in the same process, show_log() will return before printing out the commit message (because the invocation to get_cached_commit_buffer() returns NULL, because the commit buffer was not saved). I discovered this when attempting to run "git log -S" in a partial clone, triggering the case where revision walking lazily loads missing objects.

Therefore, restore save_commit_buffer to its original value after use.

An alternative to solve the problem I had is to replace get_cached_commit_buffer() with get_commit_buffer(). That invocation was introduced in commit a97934d ("use get_cached_commit_buffer where appropriate", 2014-06-13) to replace "commit->buffer" introduced in commit 3131b71 ("Add "--show-all" revision walker flag for debugging", 2008-02-13). In the latter commit, the commit author seems to be deciding between not showing an unparsed commit at all and showing an unparsed commit without the message (which is what the commit does), and did not mention parsing the unparsed commit, so I prefer to preserve the existing behavior.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
---
 fetch-pack.c | 4 ++++
 1 file changed, 4 insertions(+)
diff --git a/fetch-pack.c b/fetch-pack.c
index 895e8f9..121f03e 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -717,6 +717,7 @@ static int everything_local(struct fetch_pack_args *args,
 {
 	struct ref *ref;
 	int retval;
+	int old_save_commit_buffer = save_commit_buffer;
 	timestamp_t cutoff = 0;
 
 	save_commit_buffer = 0;
@@ -784,6 +785,9 @@ static int everything_local(struct fetch_pack_args *args,
 		print_verbose(args, _("already have %s (%s)"), oid_to_hex(remote),
 			      ref->name);
 	}
+
+	save_commit_buffer = old_save_commit_buffer;
+
 	return retval;
 }
 
-- 
2.9.3
Previous: Jeff HostetlerNext: Jeff Hostetler
Message 14 of 19 in “Parial clone part 3: clone, fetch, fetch-pack, upload-pack, and tests”
  1. 00/15 Parial clone part 3: clone, fetch, fetch-pack, upload-pack, and testsJeff Hostetler, Nov 16, 2017
  2. 01/15 upload-pack: add object filtering for partial cloneJeff Hostetler, Nov 16, 2017
  3. 02/15 clone, fetch-pack, index-pack, transport: partial cloneJeff Hostetler, Nov 16, 2017
  4. 05/15 remote-curl: add object filtering for partial cloneJeff Hostetler, Nov 16, 2017
  5. 04/15 fetch: add object filtering for partial fetchJeff Hostetler, Nov 16, 2017
  6. 07/15 fetch-pack: test support excluding large blobsJeff Hostetler, Nov 16, 2017
  7. 03/15 fetch: refactor calculation of remote listJeff Hostetler, Nov 16, 2017
  8. 08/15 partial-clone: define partial clone settings in configJeff Hostetler, Nov 16, 2017
  9. 11/15 t5500: add fetch-pack tests for partial cloneJeff Hostetler, Nov 16, 2017
  10. 10/15 fetch: add from_promisor and exclude-promisor-objects parametersJeff Hostetler, Nov 16, 2017
  11. 14/15 unpack-trees: batch fetching of missing blobsJeff Hostetler, Nov 16, 2017
  12. 13/15 t5500: more tests for partial clone and fetchJeff Hostetler, Nov 16, 2017
  13. 12/15 t5601: test for partial cloneJeff Hostetler, Nov 16, 2017
  14. 15/15 fetch-pack: restore save_commit_buffer after useJeff Hostetler, Nov 16, 2017
  15. 06/15 pack-objects: test support for blob filteringJeff Hostetler, Nov 16, 2017
  16. 09/15 fetch-pack: test support excluding large blobsJeff Hostetler, Nov 16, 2017
  17. Junio C HamanoNov 17, 2017
  18. Jonathan TanNov 21, 2017
  19. Jeff HostetlerNov 21, 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.