From: Derrick Stolee <derrickstolee@github.com>
To: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
"René Scharfe" <l.s.r@web.de>
Cc: Git List <git@vger.kernel.org>,
Junio C Hamano <gitster@pobox.com>,
Victoria Dye <vdye@github.com>
Subject: Re: [PATCH] cache-tree: fix strbuf growth in prime_cache_tree_rec()
Date: Mon, 6 Feb 2023 10:27:53 -0500 [thread overview]
Message-ID: <b1a3e684-26f9-0053-9446-751d73e83961@github.com> (raw)
In-Reply-To: <230205.86r0v37qdb.gmgdl@evledraar.gmail.com>
On 2/5/2023 4:12 PM, Ævar Arnfjörð Bjarmason wrote:
>
> On Sat, Feb 04 2023, René Scharfe wrote:
>
>> Use size_t to store the original length of the strbuf tree_len, as
>> that's the correct type.
>>
>> Don't double the allocated size of the strbuf when adding a subdirectory
>> name. Only extend it to fit that name and a slash.
>>
>> Signed-off-by: René Scharfe <l.s.r@web.de>
>> ---
>> cache-tree.c | 4 ++--
>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/cache-tree.c b/cache-tree.c
>> index 9af457f47c..35f7617164 100644
>> --- a/cache-tree.c
>> +++ b/cache-tree.c
>> @@ -760,7 +760,7 @@ static void prime_cache_tree_rec(struct repository *r,
>> struct tree_desc desc;
>> struct name_entry entry;
>> int cnt;
>> - int base_path_len = tree_path->len;
>> + size_t base_path_len = tree_path->len;
>>
>> oidcpy(&it->oid, &tree->object.oid);
>>
>> @@ -785,7 +785,7 @@ static void prime_cache_tree_rec(struct repository *r,
>> */
>> if (r->index->sparse_index) {
>> strbuf_setlen(tree_path, base_path_len);
>> - strbuf_grow(tree_path, base_path_len + entry.pathlen + 1);
>> + strbuf_grow(tree_path, entry.pathlen + 1);
>> strbuf_add(tree_path, entry.path, entry.pathlen);
>> strbuf_addch(tree_path, '/');
>> }
>
> The size_t conversion is trivially correct.
I agree, and thanks for finding and fixing this issue.
Upon reading strbuf_grow(), I would expect it to work the same
as ALLOC_GROW(), but its documentation clearly states a very
different result.
> One wonders if (even for this index-related code) we really need such
> careful management of growth, and could instead do with:
>
> strbuf_setlen(tree_path, base_path_len);
> strbuf_add(tree_path, entry.path, entry.pathlen);
> strbuf_addch(tree_path, '/');
This would be my preferred way to go here.
> Or even just:
>
> strbuf_addf(tree_path, "%*.s/", (int)entry.pathlen, entry.path);
Please do not add "addf" functions that can be run in tight loops.
It's faster to do strbuf_add() followed by strbuf_addch().
Thanks,
-Stolee
next prev parent reply other threads:[~2023-02-06 15:28 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-04 19:10 [PATCH] cache-tree: fix strbuf growth in prime_cache_tree_rec() René Scharfe
2023-02-05 21:12 ` Ævar Arnfjörð Bjarmason
2023-02-06 15:27 ` Derrick Stolee [this message]
2023-02-06 16:18 ` Ævar Arnfjörð Bjarmason
2023-02-12 11:20 ` René Scharfe
2023-02-06 18:55 ` Junio C Hamano
2023-02-10 20:20 ` René Scharfe
2023-02-10 20:20 ` René Scharfe
2023-02-10 20:33 ` Junio C Hamano
2023-02-11 2:15 ` Jeff King
2023-02-11 2:46 ` Junio C Hamano
2023-02-10 20:20 ` [PATCH v2] " René Scharfe
2023-02-13 13:37 ` Derrick Stolee
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b1a3e684-26f9-0053-9446-751d73e83961@github.com \
--to=derrickstolee@github.com \
--cc=avarab@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=l.s.r@web.de \
--cc=vdye@github.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.