On Sat, Jun 24, 2017 at 02:12:30PM +0200, René Scharfe wrote: > > That's redundant with "subdir_nr". Should we push that logic down into > > the function, and basically do: > > > > if (subdir_nr < 0 || subdir_nr > 256) > > BUG("object subdir number out of range"); > > Hmm. I don't expect many more callers, so do we really need this safety > check? It's cheap compared to the readdir(3) call, of course. To me it's as much about documenting the assumptions as it is about catching buggy callers. I'd be OK with a comment, too. > But wouldn't it make more sense to use an unsigned data type to avoid > the first half? And an unsigned char specifically to only accept valid > values, leaving the overflow concern to the caller? It warrants a > separate patch in any case IMHO. Using unsigned makes sense. Using "char" because you know it only goes to 256 is a bit too subtle for my taste. And yes, I'd do it in a preparatory patch (or follow-on if you prefer). > -- >8 -- > Subject: [PATCH] sha1_file: let for_each_file_in_obj_subdir() handle subdir names > > The function for_each_file_in_obj_subdir() takes a object subdirectory > number and expects the name of the same subdirectory to be included in > the path strbuf. Avoid this redundancy by letting the function append > the hexadecimal subdirectory name itself. This makes it a bit easier > and safer to use the function -- it becomes impossible to specify > different subdirectories in subdir_nr and path. Yeah, this is what I had in mind. > for (i = 0; i < 256; i++) { > - strbuf_addf(path, "/%02x", i); > r = for_each_file_in_obj_subdir(i, path, obj_cb, cruft_cb, > subdir_cb, data); > - strbuf_setlen(path, baselen); One side effect of the original code is that this trailing setlen() would catch any early-exits from for_each_file_in_obj_subdir() which forgot to reset the strbuf. If any exist, that's a bug that should be in fixed in that function, though. I double-checked, and there aren't any (your patch already handles the extra setlen required when opendir fails). -Peff