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

[PATCH] ref-filter: don't look for objects when outside of a repository

From
SZEDER Gábor <szeder.dev@gmail.com>
Date
Sep 22, 2018, 14:11 UTC
Message-ID
<20180922141145.10558-1-szeder.dev@gmail.com>
In-Reply-To
<20180922124215.0c8172d1@pc09.procura.nl>

The command 'git ls-remote --sort=authordate <remote>' segfaults when run outside of a repository, ever since the introduction of its '--sort' option in 1fb20dfd8e (ls-remote: create '--sort' option, 2018-04-09).

While in general the 'git ls-remote' command can be run outside of a repository just fine, its '--sort=<key>' option with certain keys does require access to the referenced objects. This sorting is implemented using the generic ref-filter sorting facility, which already handles missing objects gracefully with the appropriate 'missing object deadbeef for HEAD' message. However, being generic means that it checks replace refs while trying to retrieve an object, and while doing so it accesses the 'git_replace_ref_base' variable, which has not been initialized and is still a NULL pointer when outside of a repository, thus causing the segfault.

Make ref-filter more careful and only attempt to retrieve an object when we are in a repository. Also add a test to ensure that 'git ls-remote --sort' fails gracefully when executed outside of a repository.

Reported-by: H.Merijn Brand <h.m.brand@xs4all.nl>
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
---

I'm not quite sure that this is the best place to add this check... but hey, it's a Saturday afternoon after all ;)

 ref-filter.c         | 3 ++-
 t/t5512-ls-remote.sh | 6 ++++++
 2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/ref-filter.c b/ref-filter.c
index e1bcb4ca8a..3555bc29e7 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -1473,7 +1473,8 @@ static int get_object(struct ref_array_item *ref, int deref, struct object **obj
 		oi->info.sizep = &oi->size;
 		oi->info.typep = &oi->type;
 	}
-	if (oid_object_info_extended(the_repository, &oi->oid, &oi->info,
+	if (!have_git_dir() ||
+	    oid_object_info_extended(the_repository, &oi->oid, &oi->info,
 				     OBJECT_INFO_LOOKUP_REPLACE))
 		return strbuf_addf_ret(err, -1, _("missing object %s for %s"),
 				       oid_to_hex(&oi->oid), ref->refname);
diff --git a/t/t5512-ls-remote.sh b/t/t5512-ls-remote.sh
index bc5703ff9b..7dd081da01 100755
--- a/t/t5512-ls-remote.sh
+++ b/t/t5512-ls-remote.sh
@@ -302,4 +302,10 @@ test_expect_success 'ls-remote works outside repository' '
 	nongit git ls-remote dst.git
 '
 
+test_expect_success 'ls-remote --sort fails gracefully outside repository' '
+	# Use a sort key that requires access to the referenced objects.
+	nongit test_must_fail git ls-remote --sort=authordate "$TRASH_DIRECTORY" 2>err &&
+	test_i18ngrep "^fatal: missing object" err
+'
+
 test_done
-- 
2.19.0.355.geb876cd9d6
Previous: Ævar Arnfjörð BjarmasonNext: Junio C Hamano
Message 3 of 15 in “Coredump on ls-remote + --sort”
  1. H.Merijn BrandSep 22, 2018
  2. Ævar Arnfjörð BjarmasonSep 22, 2018
  3. ref-filter: don't look for objects when outside of a repositorySZEDER Gábor, Sep 22, 2018
  4. Junio C HamanoSep 24, 2018
  5. Jeff KingSep 24, 2018
  6. SZEDER GáborSep 24, 2018
  7. Jeff KingSep 24, 2018
  8. Junio C HamanoSep 25, 2018
  9. ref-filter: don't look for objects when outside of a repositorySZEDER Gábor, Nov 14, 2018
  10. Jeff KingNov 15, 2018
  11. Jeff KingNov 15, 2018
  12. Junio C HamanoNov 16, 2018
  13. Jeff KingNov 16, 2018
  14. Junio C HamanoNov 16, 2018
  15. SZEDER GáborNov 16, 2018

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.