git/builtin
Jeff King 8cfd4ac215 describe: handle blob traversal with no commits
When describing a blob, we traverse from HEAD, remembering each commit
we saw, and then checking each blob to report the containing commit.
But if we haven't seen any commits at all, we'll segfault (we store the
"current" commit as an oid initialized to the null oid, causing
lookup_commit_reference() to return NULL).

This shouldn't be able to happen normally. We always start our traversal
at HEAD, which must be a commit (a property which is enforced by the
refs code). But you can trigger the segfault like this:

  blob=$(echo foo | git hash-object -w --stdin)
  echo $blob >.git/HEAD
  git describe $blob

We can instead catch this case and return an empty result, which hits
the usual "we didn't find $blob while traversing HEAD" error.

This is a minor lie in that we did "find" the blob. And this even hints
at a bigger problem in this code: what if the traversal pointed to the
blob as _not_ part of a commit at all, but we had previously filled in
the recorded "current commit"? One could imagine this happening due to a
tag pointing directly to the blob in question.

But that can't happen, because we only traverse from HEAD, never from
any other refs. And the intent of the blob-describing code is to find
blobs within commits.

So I think this matches the original intent as closely as we can (and
again, this segfault cannot be triggered without corrupting your
repository!).

The test here does not use the formula above, which works only for the
files backend (and not reftables). Instead we use another loophole to
create the bogus state using only Git commands. See the comment in the
test for details.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2025-08-20 09:06:02 -07:00
..
add.c Merge branch 'lm/add-p-context' 2025-08-04 08:10:33 -07:00
am.c config: drop `git_config_get_bool()` wrapper 2025-07-23 08:15:20 -07:00
annotate.c Merge branch 'jc/a-commands-without-the-repo' 2024-10-25 14:02:36 -04:00
apply.c builtin: use default hash when outside a repository 2025-07-01 14:58:24 -07:00
archive.c archive: remove the_repository global variable 2024-10-11 09:37:18 -07:00
backfill.c odb: rename `has_object()` 2025-07-01 14:46:38 -07:00
bisect.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
blame.c Merge branch 'ps/config-wo-the-repository' 2025-08-04 08:10:33 -07:00
branch.c config: drop `git_config_set_multivar()` wrapper 2025-07-23 08:15:21 -07:00
bugreport.c object-file: move `safe_create_leading_directories()` into "path.c" 2025-04-15 08:24:35 -07:00
bundle.c Merge branch 'jt/bundle-fsck' 2024-12-13 07:33:36 -08:00
cat-file.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
check-attr.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
check-ignore.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
check-mailmap.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
check-ref-format.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
checkout--worker.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
checkout-index.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
checkout.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
clean.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
clone.c config: drop `git_config_set_multivar()` wrapper 2025-07-23 08:15:21 -07:00
column.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
commit-graph.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
commit-tree.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
commit.c Merge branch 'lm/add-p-context' 2025-08-04 08:10:33 -07:00
config.c config: drop `git_config_set_multivar_in_file_gently()` wrapper 2025-07-23 08:15:21 -07:00
count-objects.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
credential-cache--daemon.c config: drop `git_config_get_bool()` wrapper 2025-07-23 08:15:20 -07:00
credential-cache.c Merge branch 'rj/cygwin-exit' 2024-11-01 12:53:19 -04:00
credential-store.c config: drop `git_config_get_int()` wrapper 2025-07-23 08:15:20 -07:00
credential.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
describe.c describe: handle blob traversal with no commits 2025-08-20 09:06:02 -07:00
diagnose.c object-file: move `safe_create_leading_directories()` into "path.c" 2025-04-15 08:24:35 -07:00
diff-files.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
diff-index.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
diff-pairs.c builtin/diff-pairs: allow explicit diff queue flush 2025-03-03 08:17:47 -08:00
diff-tree.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
diff.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
difftool.c odb: rename `repo_read_object_file()` 2025-07-01 14:46:38 -07:00
fast-export.c Merge branch 'ps/config-wo-the-repository' 2025-08-04 08:10:33 -07:00
fast-import.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
fetch-pack.c builtin/fetch-pack: cleanup before return error 2025-06-04 08:52:25 -07:00
fetch.c config: drop `git_config_get_int()` wrapper 2025-07-23 08:15:20 -07:00
fmt-merge-msg.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
for-each-ref.c Merge branch 'rs/for-each-ref-start-after-marker-fix' 2025-08-11 21:30:15 -07:00
for-each-repo.c global: trivial conversions to fix `-Wsign-compare` warnings 2024-12-06 20:20:04 +09:00
fsck.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
fsmonitor--daemon.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
gc.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
get-tar-commit-id.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
grep.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
hash-object.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
help.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
hook.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
index-pack.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
init-db.c Merge branch 'ps/parse-options-integers' 2025-04-24 17:25:34 -07:00
interpret-trailers.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
log.c Merge branch 'ps/config-wo-the-repository' 2025-08-04 08:10:33 -07:00
ls-files.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
ls-remote.c builtin: use default hash when outside a repository 2025-07-01 14:58:24 -07:00
ls-tree.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
mailinfo.c mailinfo: stop using `the_repository` 2024-12-18 10:44:31 -08:00
mailsplit.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
merge-base.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
merge-file.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
merge-index.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
merge-ours.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
merge-recursive.c builtin/merge-recursive: switch to using merge_ort_generic() 2025-04-08 13:59:11 -07:00
merge-tree.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
merge.c Merge branch 'rs/merge-compact-summary' 2025-08-11 21:30:16 -07:00
mktag.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
mktree.c odb: introduce `odb_write_object()` 2025-07-16 22:16:15 -07:00
multi-pack-index.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
mv.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
name-rev.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
notes.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
pack-objects.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
pack-redundant.c Merge branch 'ps/object-store' 2025-07-15 15:18:18 -07:00
pack-refs.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
patch-id.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
prune-packed.c builtin: remove USE_THE_REPOSITORY for those without the_repository 2024-09-13 14:33:30 -07:00
prune.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
pull.c Merge branch 'ps/config-wo-the-repository' 2025-08-04 08:10:33 -07:00
push.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
range-diff.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
read-tree.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
rebase.c Merge branch 'ps/config-wo-the-repository' 2025-08-04 08:10:33 -07:00
receive-pack.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
reflog.c Merge branch 'ps/config-wo-the-repository' 2025-08-04 08:10:33 -07:00
refs.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
remote-ext.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
remote-fd.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
remote.c Merge branch 'dl/squelch-maybe-uninitialized' 2025-08-07 08:14:38 -07:00
repack.c Merge branch 'ps/config-wo-the-repository' 2025-08-04 08:10:33 -07:00
replace.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
replay.c repo_logmsg_reencode: fix memory leak when use repo_logmsg_reencode () 2025-06-05 08:35:22 -07:00
rerere.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
reset.c Merge branch 'lm/add-p-context' 2025-08-04 08:10:33 -07:00
rev-list.c Merge branch 'ps/config-wo-the-repository' 2025-08-04 08:10:33 -07:00
rev-parse.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
revert.c Merge branch 'jk/revert-squelch-compiler-warning' 2025-08-07 08:14:37 -07:00
rm.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
send-pack.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
shortlog.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
show-branch.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
show-index.c builtin: use default hash when outside a repository 2025-07-01 14:58:24 -07:00
show-ref.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
sparse-checkout.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
stash.c Merge branch 'lm/add-p-context' 2025-08-04 08:10:33 -07:00
stripspace.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
submodule--helper.c Merge branch 'kj/renamed-submodule' 2025-08-05 11:53:56 -07:00
symbolic-ref.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
tag.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
unpack-file.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
unpack-objects.c Merge branch 'ps/object-file-wo-the-repository' 2025-08-05 11:53:55 -07:00
update-index.c config: drop `git_config()` wrapper 2025-07-23 08:15:18 -07:00
update-ref.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
update-server-info.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
upload-archive.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
upload-pack.c serve: stop using `the_repository` 2024-12-18 10:44:30 -08:00
var.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
verify-commit.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
verify-pack.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
verify-tag.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00
worktree.c config: drop `git_config_set_multivar_in_file_gently()` wrapper 2025-07-23 08:15:21 -07:00
write-tree.c config: move Git config parsing into "environment.c" 2025-07-23 08:15:22 -07:00