On Wed, Mar 31, 2021 at 6:50 PM Derrick Stolee via GitGitGadget <gitgitgadget@xxxxxxxxx> wrote: > > From: Derrick Stolee <dstolee@xxxxxxxxxxxxx> > > 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@xxxxxxxxxxxxx> > --- > name-hash.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/name-hash.c b/name-hash.c > index 4e03fac9bb12..75c159e06eeb 100644 > --- a/name-hash.c > +++ b/name-hash.c > @@ -8,6 +8,7 @@ > #include "cache.h" > #include "thread-utils.h" > #include "trace2.h" > +#include "sparse-index.h" > > struct dir_entry { > struct hashmap_entry ent; > @@ -109,6 +110,12 @@ static void hash_index_entry(struct index_state *istate, struct cache_entry *ce) > if (ce->ce_flags & CE_HASHED) > return; > ce->ce_flags |= CE_HASHED; > + > + if (S_ISSPARSEDIR(ce->ce_mode)) { > + add_dir_entry(istate, ce); > + return; > + } I don't see how this relates to the commit message. Was this meant to be included in another commit? If it is intended to be included here, could an explanation be added? > + > hashmap_entry_init(&ce->ent, memihash(ce->name, ce_namelen(ce))); > hashmap_add(&istate->name_hash, &ce->ent); > > @@ -680,6 +687,7 @@ int index_dir_exists(struct index_state *istate, const char *name, int namelen) > struct dir_entry *dir; > > lazy_init_name_hash(istate); > + expand_to_path(istate, name, namelen, 0); > dir = find_dir_entry(istate, name, namelen); > return dir && dir->nr; > } > @@ -690,6 +698,7 @@ void adjust_dirname_case(struct index_state *istate, char *name) > const char *ptr = startPtr; > > lazy_init_name_hash(istate); > + expand_to_path(istate, name, strlen(name), 0); > while (*ptr) { > while (*ptr && *ptr != '/') > ptr++; > @@ -713,6 +722,7 @@ struct cache_entry *index_file_exists(struct index_state *istate, const char *na > unsigned int hash = memihash(name, namelen); > > lazy_init_name_hash(istate); > + expand_to_path(istate, name, namelen, icase); > > ce = hashmap_get_entry_from_hash(&istate->name_hash, hash, NULL, > struct cache_entry, ent); > -- > gitgitgadget