Re: [PATCH 05/11] submodule-config: avoid memory leak
- From
Glen Choo <chooglen@google.com>
- Date
- Jun 16, 2022, 18:09 UTC
- Message-ID
- <kl6lpmj84h18.fsf@chooglen-macbookpro.roam.corp.google.com>
- In-Reply-To
- <xmqqmtedw7fm.fsf@gitster.g>
Junio C Hamano <gitster@pobox.com> writes:
Show 14 quoted lines
> "Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com> > writes: > >> From: Johannes Schindelin <johannes.schindelin@gmx.de> >> >> In 961b130d20c9 (branch: add --recurse-submodules option for branch >> creation, 2022-01-28), a funny pattern was introduced where first some >> struct is `xmalloc()`ed, then we resize an array whose element type is >> the same struct, and then the first struct's contents are copied into >> the last element of that array. > > Sigh. The original is butt ugly, with this strange pattern and > structure assignments etc. I wonder how something like this slipped > through our reviews.
Gah, I have no excuses for bad code I've already written, I can only strive to write better code next time.
Thanks Johannes for spotting and fixing this.
> I wonder if it would help for me to stop trusting reviews by less > experienced reviewers too much, and instead give sanity checks to > more patches myself from now on, but I certainly cannot afford the > time and my mental health to do so for all the patches X-<.
I seem to recall that this was reviewed by fairly experienced folks. I'm guessing it slipped through due to reviewer fatigue, which might be a good argument for adding more tooling to lighten reviewer load/patch up the gaps.
Show 23 quoted lines
>
> Will queue.
>
>> if (S_ISGITLINK(name_entry->mode) &&
>> is_tree_submodule_active(r, root_tree, tree_path)) {
>> - st_entry = xmalloc(sizeof(*st_entry));
>> + ALLOC_GROW(out->entries, out->entry_nr + 1,
>> + out->entry_alloc);
>> + st_entry = &out->entries[out->entry_nr++];
>> +
>> st_entry->name_entry = xmalloc(sizeof(*st_entry->name_entry));
>> *st_entry->name_entry = *name_entry;
>> st_entry->submodule =
>> @@ -766,9 +769,6 @@ static void traverse_tree_submodules(struct repository *r,
>> root_tree))
>> FREE_AND_NULL(st_entry->repo);
>>
>> - ALLOC_GROW(out->entries, out->entry_nr + 1,
>> - out->entry_alloc);
>> - out->entries[out->entry_nr++] = *st_entry;
>> } else if (S_ISDIR(name_entry->mode))
>> traverse_tree_submodules(r, root_tree, tree_path,
>> &name_entry->oid, out);