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

Re: Null pointer dereference in git-submodule

From
René Scharfe <l.s.r@web.de>
Date
Mar 25, 2018, 10:57 UTC
Message-ID
<9c3c0161-f894-3368-ece2-500d0bb6f475@web.de>
In-Reply-To
<20180325095046.GA687@feusi.co>
Am 25.03.2018 um 11:50 schrieb Jeremy Feusi:
Show 11 quoted lines
> 
> Hmm... That's weird. I can reproduce it on 3 independant systems with
> versions 2.16.2 up, although it does not work with version 2.11.0.
> Anyway, I figured out how to reproduce this bug. It is caused when a
> submodule is added and then the directory it resides in is moved or
> deleted without commiting. For example:
> 
> git init
> git submodule add https://github.com/git/git git
> mv git git.BAK
> git submodule status #this command segfaults
With the patch I sent in my first reply the last command reports:
	fatal: no ref store in submodule 'git'

That may not be the most helpful message -- not just the ref store is missing, the whole submodule is gone!

Come to think about it, this removal may be intended. How about showing the submodule as not being initialized at that point?

-- >8 --
Subject: [PATCH v2] submodule: check for NULL return of get_submodule_ref_store()

If we can't find a ref store for a submodule then assume it the latter is not initialized (or was removed). Print a status line accordingly instead of causing a segmentation fault by passing NULL as the first parameter of refs_head_ref().

Reported-by: Jeremy Feusi <jeremy@feusi.co>
Signed-off-by: Rene Scharfe <l.s.r@web.de>
---
Test missing..
 builtin/submodule--helper.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index ee020d4749..ae3014ac5a 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -654,9 +654,13 @@ static void status_submodule(const char *path, const struct object_id *ce_oid,
 			     displaypath);
 	} else if (!(flags & OPT_CACHED)) {
 		struct object_id oid;
+		struct ref_store *refs = get_submodule_ref_store(path);
 
-		if (refs_head_ref(get_submodule_ref_store(path),
-				  handle_submodule_head_ref, &oid))
+		if (!refs) {
+			print_status(flags, '-', path, ce_oid, displaypath);
+			goto cleanup;
+		}
+		if (refs_head_ref(refs, handle_submodule_head_ref, &oid))
 			die(_("could not resolve HEAD ref inside the "
 			      "submodule '%s'"), path);
 
-- 
2.17.0.rc1.38.g7c51fd80b8
Previous: Jeremy FeusiNext: Stefan Beller
Message 2 of 14 in “Re: Null pointer dereference in git-submodule”
  1. Jeremy FeusiMar 25, 2018
  2. René ScharfeMar 25, 2018
  3. Stefan BellerMar 27, 2018
  4. Junio C HamanoMar 28, 2018
  5. Stefan BellerMar 28, 2018
  6. submodule: check for NULL return of get_submodule_ref_store()Stefan Beller, Mar 28, 2018
  7. Eric SunshineMar 28, 2018
  8. Stefan BellerMar 28, 2018
  9. Eric SunshineMar 28, 2018
  10. Stefan BellerMar 28, 2018
  11. René ScharfeMar 28, 2018
  12. Stefan BellerMar 28, 2018
  13. René ScharfeMar 28, 2018
  14. Junio C HamanoMar 28, 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.