Re: [PATCH] [RFC] sparse index: fix use-after-free bug in cache_tree_verify()
- From
Derrick Stolee <stolee@gmail.com>
- Date
- Oct 6, 2021, 20:43 UTC
- Message-ID
- <7ef4f68c-8c32-86ea-f8a6-cd673ed281c7@gmail.com>
- In-Reply-To
- <xmqq1r4yrmhp.fsf@gitster.g>
On 10/6/2021 3:17 PM, Junio C Hamano wrote:
Show 40 quoted lines
> "Phillip Wood via GitGitGadget" <gitgitgadget@gmail.com> writes:
>> @@ -907,6 +917,9 @@ void cache_tree_verify(struct repository *r, struct index_state *istate)
>>
>> if (!istate->cache_tree)
>> return;
>> - verify_one(r, istate, istate->cache_tree, &path);
>> + if (verify_one(r, istate, istate->cache_tree, &path)) {
>> + strbuf_reset(&path);
>> + verify_one(r, istate, istate->cache_tree, &path);
>> + }
>> strbuf_release(&path);
>> }
>
> This is just a style thing, but I would find it easier to follow if
> it just recursed into itself, i.e.
>
> - verify_one(...);
> + if (verify_one(...))
> + cache_tree_verify(r, istate);
>
> or
>
> - verify_one(...);
> + again:
> + if (verify_one(...))
> + strbuf_reset(&path);
> + goto again;
> } }
>
> On the other hand, if the new code wants to say "I would retry at
> most once, otherwise there is something wrong in me", then
>
>> - verify_one(r, istate, istate->cache_tree, &path);
>> + if (verify_one(r, istate, istate->cache_tree, &path)) {
>> + strbuf_reset(&path);
>> + if (verify_one(r, istate, istate->cache_tree, &path))
>> + BUG("...");
>> + }
>
> would be better.I'm in favor of this second option.
Thanks, -Stolee