diff mbox series

[v2,25/25] name-hash: use expand_to_path()

Message ID 7e2d3fae9a2a0574d2f881d0bcd4931a2cad6b45.1617241803.git.gitgitgadget@gmail.com (mailing list archive)
State New, archived
Headers show
Series Sparse Index: API protections | expand

Commit Message

Derrick Stolee April 1, 2021, 1:50 a.m. UTC
From: Derrick Stolee <dstolee@microsoft.com>

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>
---
 name-hash.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

Comments

Elijah Newren April 5, 2021, 7:53 p.m. UTC | #1
On Wed, Mar 31, 2021 at 6:50 PM Derrick Stolee via GitGitGadget
<gitgitgadget@gmail.com> wrote:
>
> From: Derrick Stolee <dstolee@microsoft.com>
>
> 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>
> ---
>  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
diff mbox series

Patch

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;
+	}
+
 	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);