From: "René Scharfe" <l.s.r@web.de>
To: Jeff King <peff@peff.net>
Cc: Junio C Hamano <gitster@pobox.com>, git@vger.kernel.org
Subject: Re: [RFC] cocci: .buf in a strbuf object can never be NULL
Date: Sun, 22 Mar 2026 00:41:04 +0100 [thread overview]
Message-ID: <ca9fa6c7-f693-4b85-a17f-8deeb05b45f7@web.de> (raw)
In-Reply-To: <20260321211828.GB736981@coredump.intra.peff.net>
On 3/21/26 10:18 PM, Jeff King wrote:
> On Sat, Mar 21, 2026 at 09:47:18PM +0100, René Scharfe wrote:
>
>> And yet this function can turn an empty strbuf into an allocated one
>> without rolling it back on error, leaving code similar to this silly
>> example here leaking:
>>
>> int copy_one_line(FILE *in, FILE *out, int term)
>> {
>> struct strbuf sb = STRBUF_INIT;
>> if (strbuf_getwholeline(&sb, in, term))
>> return -1;
>> fwrite(sb.buf, 1, sb.len, out);
>> strbuf_release(&sb);
>> return 0;
>> }
>
> Yes, I almost pointed that out, but I think it's mostly a non-issue
> in practice because you'd generally call it multiple times (usually in a
> loop, but sometimes just multiple individual calls). And then you have
> to release if any call ever succeeded, which means either doing so after
> the loop ends or in a cleanup block.
>
> Grepping for 'if (strbuf_get.*line', the closest I found was
> get_mail_commit_oid(), which reads a single line. It doesn't have an
> early return, though, since it has to clean up the FILE pointer anyway.
Caller strbuf_appendwholeline() handles a single line and invokes
strbuf_release() on error, so it swings in the opposite direction.
> So I dunno. I don't think it's been a problem in practice, but I'm not
> opposed to future-proofing if it's easy to do.
I also don't think it's a problem.
> I feel like there's a lot of discussion in this thread but we're not
> achieving anything practical.
Funny how attention works.
> If we do anything, I think it would be:
>
> - drop the feof and reset at the top of the function, which are
> redundant
Easy win. We can also drop the feof(3) call from the non-getdelim(3)
version, but need to keep the reset there.
> - make a noop read on an unallocated strbuf retain the unallocated
> state (your example above)
That makes the function conform to the convention of rolling back on
error. This transactional behavior is a bit easier to understand. The
non-getdelim(3) version doesn't do that, though. It returns whatever
it got and leaves error checking and rollback to its callers.
getdelim(3) doesn't allow that -- it has no way to indicate the length
of partial reads. If we are OK with throwing away partial lines then
we better do that consistently in both versions? Sounds a bit messed
up to bin perfectly good data just because some other platform has a
fancy function that goes quiet when it stumbles. The alternative of
having inconsistent behavior seems worse, though.
René
next prev parent reply other threads:[~2026-03-21 23:41 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-19 7:15 [PATCH] rerere: update to modern representation of empty strbufs Junio C Hamano
2026-03-19 7:57 ` Patrick Steinhardt
2026-03-19 22:14 ` [RFC] cocci: .buf in a strbuf object can never be NULL Junio C Hamano
2026-03-19 23:35 ` Jeff King
2026-03-20 1:46 ` Junio C Hamano
2026-03-20 4:18 ` Jeff King
2026-03-20 5:45 ` Junio C Hamano
2026-03-20 5:57 ` Jeff King
2026-03-20 6:06 ` Junio C Hamano
2026-03-20 6:18 ` Jeff King
2026-03-21 13:14 ` René Scharfe
2026-03-21 16:41 ` Jeff King
2026-03-21 20:47 ` René Scharfe
2026-03-21 21:18 ` Jeff King
2026-03-21 23:41 ` René Scharfe [this message]
2026-03-22 1:44 ` Jeff King
2026-03-22 1:22 ` Junio C Hamano
2026-03-22 1:40 ` Jeff King
2026-03-21 16:24 ` Junio C Hamano
2026-03-21 16:39 ` Jeff King
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=ca9fa6c7-f693-4b85-a17f-8deeb05b45f7@web.de \
--to=l.s.r@web.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=peff@peff.net \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox