]> git.ipfire.org Git - thirdparty/git.git/commit
submodule: avoid auto-discovery in prepare_submodule_repo_env()
authorJunio C Hamano <gitster@pobox.com>
Thu, 1 Sep 2016 20:51:48 +0000 (13:51 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 1 Sep 2016 21:01:29 +0000 (14:01 -0700)
commit10f5c526561604ba9677dc27643b5c9bfad36458
tree3ccbdde6d863c382f145ffaa3098fd3be1933250
parente0c1ceafc5bece92d35773a75fff59497e1d9bd5
submodule: avoid auto-discovery in prepare_submodule_repo_env()

The function is used to set up the environment variable used in a
subprocess we spawn in a submodule directory.  The callers set up a
child_process structure, find the working tree path of one submodule
and set .dir field to it, and then use start_command() API to spawn
the subprocess like "status", "fetch", etc.

When this happens, we expect that the ".git" (either a directory or
a gitfile that points at the real location) in the current working
directory of the subprocess MUST be the repository for the submodule.

If this ".git" thing is a corrupt repository, however, because
prepare_submodule_repo_env() unsets GIT_DIR and GIT_WORK_TREE, the
subprocess will see ".git", thinks it is not a repository, and
attempt to find one by going up, likely to end up in finding the
repository of the superproject.  In some codepaths, this will cause
a command run with the "--recurse-submodules" option to recurse
forever.

By exporting GIT_DIR=.git, disable the auto-discovery logic in the
subprocess, which would instead stop it and report an error.

The test illustrates existing problems in a few callsites of this
function.  Without this fix, "git fetch --recurse-submodules", "git
status" and "git diff" keep recursing forever.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
submodule.c
t/t5526-fetch-submodules.sh