Karthik Nayak <karthik.188@xxxxxxxxx> writes: > The commit 090eb5336c (refs: selectively set prefix in the seek > functions, 2025-07-15) modified the ref-cache iterator to support > seeking to a specified marker without setting the prefix. > > The commit adds and uses an integer 'len' to capture the length of the > seek marker to compare with the entries of a given directory. Since the > type of the variable is 'int', this is met with a typecast of converting > a `strlen` to 'int' so it can be assigned to the 'len' variable. > > This is whole operation is a bit wrong: > 1. Since the 'len' variable is eventually used in a 'strncmp', it should > have been of type 'size_t'. > 2. This also truncates the value provided from 'strlen' to an int, which > could cause a large refname to produce a negative number. > > Let's do the correct thing here and simply use 'size_t' for `len`. > > Signed-off-by: Karthik Nayak <karthik.188@xxxxxxxxx> > --- > refs/ref-cache.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/refs/ref-cache.c b/refs/ref-cache.c > index 1d95b56d40..8df7ae43e5 100644 > --- a/refs/ref-cache.c > +++ b/refs/ref-cache.c > @@ -498,13 +498,14 @@ static int cache_ref_iterator_seek(struct ref_iterator *ref_iterator, > * indexing to each level as needed. > */ > do { > - int len, idx; > + int idx; > + size_t len; > int cmp = 0; > > sort_ref_dir(dir); > > slash = strchr(slash, '/'); > - len = slash ? slash - refname : (int)strlen(refname); > + len = slash ? (size_t)(slash - refname) : strlen(refname); The "strlen()" side is good, but was there recently a discussion on how to safely convert (slash - refname) that is ptrdiff_t to size_t? My archive search found a rather old ptrdiff_to_size() proposal https://lore.kernel.org/git/20241227213729.GA796141@xxxxxxxxxxxxxxxxxxxxxxx/ but I thought there were another discussion thread about casting to size_t recently. I _think_ a vanilla cast is safe here, as slash sits always right to refname (if not NULL, that is), and the difference should fit within size_t (because the difference is smaller than the size of the memory block pointed at by slash). So in short, this looks good. Will queue.