name-hash: use expand_to_path()

A sparse-index loads the name-hash data for its entries, including the sparse-directory entries. If a caller asks for a path that is contained within a sparse-directory entry, we need to expand to a full index and recalculate the name hash table before returning the result. Insert calls to expand_to_path() to protect against this case. Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Reviewed-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Derrick Stolee committed Apr 12, 2021 at 21:08 UTC 4589bca829a2ace58bc98876cccd7dbd2e89f732
1 file changed +4
name-hash.c
+4
@@ -8,6 +8,7 @@
8 #include "cache.h"
9 #include "thread-utils.h"
10 #include "trace2.h"
11 +#include "sparse-index.h"
12
13 struct dir_entry {
14 struct hashmap_entry ent;
@@ -683,6 +684,7 @@ int index_dir_exists(struct index_state *istate, const char *name, int namelen)
684 struct dir_entry *dir;
685
686 lazy_init_name_hash(istate);
687 + expand_to_path(istate, name, namelen, 0);
688 dir = find_dir_entry(istate, name, namelen);
689 return dir && dir->nr;
690 }
@@ -693,6 +695,7 @@ void adjust_dirname_case(struct index_state *istate, char *name)
695 const char *ptr = startPtr;
696
697 lazy_init_name_hash(istate);
698 + expand_to_path(istate, name, strlen(name), 0);
699 while (*ptr) {
700 while (*ptr && *ptr != '/')
701 ptr++;
@@ -716,6 +719,7 @@ struct cache_entry *index_file_exists(struct index_state *istate, const char *na
719 unsigned int hash = memihash(name, namelen);
720
721 lazy_init_name_hash(istate);
722 + expand_to_path(istate, name, namelen, icase);
723
724 ce = hashmap_get_entry_from_hash(&istate->name_hash, hash, NULL,
725 struct cache_entry, ent);