config: fix segfault when parsing "core.abbrev" without repo
The "core.abbrev" config allows the user to specify the minimum length when abbreviating object hashes. Next to the values "auto" and "no", this config also accepts a concrete length that needs to be bigger or equal to the minimum length and smaller or equal to the hash algorithm's hex length. While the former condition is trivial, the latter depends on the object format used by the current repository. It is thus a variable upper boundary that may either be 40 (SHA-1) or 64 (SHA-256).
This has two major downsides. First, the user that specifies this config
must be aware of the object hashes that its repository use. If they want
to configure the value globally, then they cannot pick any value in the
range [41, 64]
if they have any repository that uses SHA-1. If they
did, Git would error out when parsing the config.
Second, and more importantly, parsing "core.abbrev" crashes when outside
of a Git repository because we dereference the_hash_algo
to figure out
its hex length. Starting with c8aed5e8 (repository: stop setting SHA1
as the default object hash, 2024-05-07) though, we stopped initializing
the_hash_algo
outside of Git repositories.
Fix both of these issues by not making it an error anymore when the
given length exceeds the hash length. Instead, if we have a repository,
then we truncate the length to the maximum length of the_hash_algo
.
Otherwise, we simply leave the abbreviated length intact and store it
as-is. This is equivalent to the logic in parse_opt_abbrev_cb()
and is
handled just fine by repo_find_unique_abbrev_r()
. In practice, we
should never even end up using default_abbrev
without a repository
anyway given that abbreviating object IDs to unique prefixes requires us
to have access to an object database.
Reported-by: Kyle Lippincott spectral@google.com Signed-off-by: Patrick Steinhardt ps@pks.im