Git development
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: git@vger.kernel.org
Cc: Patrick Steinhardt <ps@pks.im>,
	"brian m. carlson" <sandals@crustytoothpaste.net>
Subject: [PATCH 7/7] hash: check ctx->active flag in all wrapper functions
Date: Tue, 7 Jul 2026 01:09:52 -0400	[thread overview]
Message-ID: <20260707050952.GG1288294@coredump.intra.peff.net> (raw)
In-Reply-To: <20260707045556.GA1288172@coredump.intra.peff.net>

It only makes sense to call git_hash_update(), etc, on a hash context
that has been initialized but not yet finalized or discarded. This is an
unlikely error to make, but it's easy for us to catch it and complain.

It's especially important because it would quietly "work" for many hash
backends (like sha1dc, which is just manipulating some bytes) but would
cause undefined behavior with others (like OpenSSL, which puts the
context onto the heap). Checking the flag lets us catch problems
consistently on every build.

Note that we can't do the same for git_init_hash(). Even though it would
cause a leak to call it twice (without an intervening final/discard),
the point of the function is that the contents of the struct are
undefined before the call. But calling it twice is an even less likely
error to make, so not covering it is OK.

Signed-off-by: Jeff King <peff@peff.net>
---
 hash.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/hash.c b/hash.c
index b1296f0018..82f7e24404 100644
--- a/hash.c
+++ b/hash.c
@@ -290,22 +290,32 @@ void git_hash_init(struct git_hash_ctx *ctx, const struct git_hash_algo *algop)
 
 void git_hash_clone(struct git_hash_ctx *dst, const struct git_hash_ctx *src)
 {
+	if (!src->active)
+		BUG("attempt to copy from an inactive hash context");
+	if (!dst->active)
+		BUG("attempt to copy to an inactive hash context");
 	src->algop->clone_fn(dst, src);
 }
 
 void git_hash_update(struct git_hash_ctx *ctx, const void *in, size_t len)
 {
+	if (!ctx->active)
+		BUG("attempt to update an inactive hash context");
 	ctx->algop->update_fn(ctx, in, len);
 }
 
 void git_hash_final(unsigned char *hash, struct git_hash_ctx *ctx)
 {
+	if (!ctx->active)
+		BUG("attempt to finalize an inactive hash context");
 	ctx->algop->final_fn(hash, ctx);
 	ctx->active = false;
 }
 
 void git_hash_final_oid(struct object_id *oid, struct git_hash_ctx *ctx)
 {
+	if (!ctx->active)
+		BUG("attempt to finalize an inactive hash context");
 	ctx->algop->final_oid_fn(oid, ctx);
 	ctx->active = false;
 }
-- 
2.55.0.459.g1b256877c9

  parent reply	other threads:[~2026-07-07  5:09 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-07  4:55 [PATCH 0/7] git_hash_*() quality-of-life improvements Jeff King
2026-07-07  5:01 ` [PATCH 1/7] hash: use git_hash_init() consistently Jeff King
2026-07-07 14:39   ` Junio C Hamano
2026-07-07 20:13     ` Jeff King
2026-07-07 20:17       ` Junio C Hamano
2026-07-07 20:25         ` Jeff King
2026-07-07 21:25   ` brian m. carlson
2026-07-08  3:54     ` Jeff King
2026-07-07  5:04 ` [PATCH 2/7] hash: convert remaining direct function calls Jeff King
2026-07-07 16:15   ` Junio C Hamano
2026-07-07  5:05 ` [PATCH 3/7] hash: document function pointers and wrappers Jeff King
2026-07-07 14:26   ` Patrick Steinhardt
2026-07-07 20:05     ` Jeff King
2026-07-07  5:07 ` [PATCH 4/7] hash: make git_hash_discard() idempotent Jeff King
2026-07-07 16:22   ` Junio C Hamano
2026-07-07 20:18     ` Jeff King
2026-07-07 21:41       ` brian m. carlson
2026-07-07 22:25         ` Junio C Hamano
2026-07-07  5:07 ` [PATCH 5/7] csum-file: use idempotent git_hash_discard() Jeff King
2026-07-07  5:08 ` [PATCH 6/7] http: " Jeff King
2026-07-07 16:25   ` Junio C Hamano
2026-07-07  5:09 ` Jeff King [this message]
2026-07-07 14:26   ` [PATCH 7/7] hash: check ctx->active flag in all wrapper functions Patrick Steinhardt
2026-07-07 16:33   ` Junio C Hamano
2026-07-07 20:10     ` Jeff King
2026-07-07 14:26 ` [PATCH 0/7] git_hash_*() quality-of-life improvements Patrick Steinhardt
2026-07-08  3:52 ` [PATCH v2 " Jeff King
2026-07-08  3:52   ` [PATCH v2 1/7] hash: use git_hash_init() consistently Jeff King
2026-07-08  3:52   ` [PATCH v2 2/7] hash: convert remaining direct function calls Jeff King
2026-07-08  3:52   ` [PATCH v2 3/7] hash: document function pointers and wrappers Jeff King
2026-07-08  3:52   ` [PATCH v2 4/7] hash: make git_hash_discard() idempotent Jeff King
2026-07-08  3:53   ` [PATCH v2 5/7] csum-file: use idempotent git_hash_discard() Jeff King
2026-07-08  3:53   ` [PATCH v2 6/7] http: " Jeff King
2026-07-08  3:53   ` [PATCH v2 7/7] hash: check ctx->active flag in all wrapper functions Jeff King
2026-07-08  8:05   ` [PATCH v2 0/7] git_hash_*() quality-of-life improvements Patrick Steinhardt

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=20260707050952.GG1288294@coredump.intra.peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    --cc=ps@pks.im \
    --cc=sandals@crustytoothpaste.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