Re: [PATCH] ref-cache: set prefix_state when seeking
Karthik Nayak <karthik.188@gmail.com> writes:
Show 32 quoted lines
> In 090eb5336c (refs: selectively set prefix in the seek functions,
> 2025-07-15) we separated the seeking functionality of reference
> iterators from the functionality to set prefix to an iterator. This
> allows users of ref iterators to seek to a particular reference to
> provide pagination support.
>
> The files-backend, uses the ref-cache iterator to iterate over loose
> refs. The iterator tracks directories and entries already processed via
> a stack of levels. Each level corresponds to a directory under the files
> backend. New levels are added to the stack, and when all entries from a
> level is yielded, the corresponding level is popped from the stack.
>
> To accommodate seeking, we need to populate and traverse the levels to
> stop the requested seek marker at the appropriate level and its entry
> index. Each level also contains a 'prefix_state' which is used for
> prefix matching, this allows the iterator to skip levels/entries which
> don't match a prefix. The default value of 'prefix_state' is
> PREFIX_CONTAINS_DIR, which yields all entries within a level. When
> purely seeking without prefix matching, we want to yield all entries.
> The commit however, skips setting the value explicitly. This causes the
> MemorySanitizer to issue a 'use-of-uninitialized-value' error when
> running 't/t6302-for-each-ref-filter'.
>
> Set the value explicitly to avoid to fix the issue.
>
> Reported-by: Kyle Lippincott <spectral@google.com>
> Helped-by: Kyle Lippincott <spectral@google.com>
> Helped-by: Jeff King <peff@peff.net>
> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
> ---
>
> Here is my version of the same patch!
Show 16 quoted lines
>
> refs/ref-cache.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/refs/ref-cache.c b/refs/ref-cache.c
> index 1d95b56d40..ceef3a2008 100644
> --- a/refs/ref-cache.c
> +++ b/refs/ref-cache.c
> @@ -527,6 +527,7 @@ static int cache_ref_iterator_seek(struct ref_iterator *ref_iterator,
> level = &iter->levels[iter->levels_nr++];
> level->dir = dir;
> level->index = -1;
> + level->prefix_state = PREFIX_CONTAINS_DIR;
> } else {
> /* reduce the index so the leaf node is iterated over */
> if (cmp <= 0 && !slash)