Git development
 help / color / mirror / Atom feed
From: "Matthew Suozzo via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Patrick Steinhardt <ps@pks.im>,
	Aniket Gupta <aniketgupta3001@gmail.com>,
	Matthew Suozzo <m@suozzo.co>
Subject: [PATCH v2 0/2] reftable: widen allocation size arguments to uintmax_t
Date: Wed, 21 Oct 2026 21:03:33 +0000	[thread overview]
Message-ID: <pull.2255.v2.git.1792616615.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2255.git.1791989883899.gitgitgadget@gmail.com>

Changes since v1:

 * Fix the truncation in reftable_alloc_size() and reftable_calloc() instead
   of checking the count in reftable_obj_record_decode() (Patrick, Aniket).
 * Test reftable_alloc_size() directly instead of the decoder (Aniket).
 * Move the Makefile change into its own patch (Patrick).
 * Rewrite the commit messages (Patrick).

Matthew Suozzo (2):
  Makefile: build the reftable record unit tests
  reftable/basics: widen allocation size arguments to uintmax_t

 Makefile                         |  1 +
 reftable/basics.c                |  9 +++++----
 reftable/basics.h                |  5 +++--
 t/unit-tests/u-reftable-basics.c | 18 ++++++++++++++++++
 4 files changed, 27 insertions(+), 6 deletions(-)


base-commit: 6de20f6092dcf9bdb1c8efe03db4b70c82b423dd
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2255%2Fmsuozzo%2Freftable-obj-record-count-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2255/msuozzo/reftable-obj-record-count-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/2255

Range-diff vs v1:

 1:  5fb73ec0a8 ! 1:  0d083bc81f reftable/record: bound an object record's offset count by its length
     @@ Metadata
      Author: Matthew Suozzo <m@suozzo.co>
      
       ## Commit message ##
     -    reftable/record: bound an object record's offset count by its length
     +    Makefile: build the reftable record unit tests
      
     -    An object record's count of offsets is a 64-bit varint from the table,
     -    and reftable_obj_record_decode() allocates the offsets array from it
     -    through REFTABLE_ALLOC_ARRAY(), which takes a size_t. Where size_t is
     -    32 bits, a count of 2^32 + 1 allocates room for one offset, and the
     -    loop, which runs to the full count, writes an offset from the table
     -    for each varint left in the block past the end of the array. Where
     -    size_t is 64 bits, a large count only makes a large allocation that
     -    the decode then fails to fill.
     +    The Meson build includes the reftable record unit tests, but the
     +    Makefile does not. The suite was dropped from the Makefile when the
     +    test was converted to the clar framework in 2596bef5841f (2025-07-24).
      
     -    Nothing in Git reaches this decoder from a repository: a block of a
     -    type other than the one wanted is refused before its records are
     -    decoded, and the object index, the only reader of object blocks, is
     -    used only by the unit tests. The decoder is still wrong.
     +    Include the reftable record unit test suite in the Makefile test
     +    target.
      
     -    Each offset takes at least a byte, so refuse a count larger than what
     -    is left of the record.
     -
     -    The Makefile did not build the reftable record unit tests (the Meson
     -    build does). Add the suite there so that the new test runs in both.
     -
     -    Assisted-by: Claude Opus 5.5, Claude Fable 5.1
     +    Assisted-by: Claude Fable 5.1
          Signed-off-by: Matthew Suozzo <m@suozzo.co>
      
       ## Makefile ##
     @@ Makefile: CLAR_TEST_SUITES += u-reftable-block
       CLAR_TEST_SUITES += u-reftable-stack
       CLAR_TEST_SUITES += u-reftable-table
       CLAR_TEST_SUITES += u-reftable-tree
     -
     - ## reftable/record.c ##
     -@@ reftable/record.c: static int reftable_obj_record_decode(void *rec, struct reftable_buf key,
     - 	if (count == 0)
     - 		return start.len - in.len;
     - 
     -+	/* each offset takes at least a byte */
     -+	if (count > in.len)
     -+		return REFTABLE_FORMAT_ERROR;
     -+
     - 	REFTABLE_ALLOC_ARRAY(r->offsets, count);
     - 	if (!r->offsets)
     - 		return REFTABLE_OUT_OF_MEMORY_ERROR;
     -
     - ## t/unit-tests/u-reftable-record.c ##
     -@@ t/unit-tests/u-reftable-record.c: void test_reftable_record__obj_record_roundtrip(void)
     - 	reftable_buf_release(&scratch);
     - }
     - 
     -+void test_reftable_record__obj_record_decode_count_larger_than_record(void)
     -+{
     -+	struct reftable_buf key = REFTABLE_BUF_INIT, scratch = REFTABLE_BUF_INIT;
     -+	struct reftable_record rec = { .type = REFTABLE_BLOCK_TYPE_OBJ };
     -+	uint8_t buffer[32];
     -+	struct string_view dest = { .buf = buffer, .len = sizeof(buffer) }, in;
     -+	int n;
     -+
     -+	/*
     -+	 * A count of offsets that a 32-bit size_t truncates to one,
     -+	 * followed by two offsets.
     -+	 */
     -+	n = put_var_int(&dest, ((uint64_t)1 << 32) + 1);
     -+	cl_assert_gt_i(n, 0);
     -+	string_view_consume(&dest, n);
     -+	n = put_var_int(&dest, 1);
     -+	cl_assert_gt_i(n, 0);
     -+	string_view_consume(&dest, n);
     -+	n = put_var_int(&dest, 1);
     -+	cl_assert_gt_i(n, 0);
     -+	string_view_consume(&dest, n);
     -+
     -+	in.buf = buffer;
     -+	in.len = sizeof(buffer) - dest.len;
     -+
     -+	cl_assert_equal_i(reftable_buf_addstr(&key, "\x01\x02"), 0);
     -+	cl_assert_equal_i(reftable_record_decode(&rec, key, 0, in,
     -+						 REFTABLE_HASH_SIZE_SHA1, &scratch),
     -+			  REFTABLE_FORMAT_ERROR);
     -+
     -+	reftable_record_release(&rec);
     -+	reftable_buf_release(&key);
     -+	reftable_buf_release(&scratch);
     -+}
     -+
     - void test_reftable_record__index_record_comparison(void)
     - {
     - 	struct reftable_record in[3] = {
 -:  ---------- > 2:  8f4a8389d0 reftable/basics: widen allocation size arguments to uintmax_t

-- 
gitgitgadget

  parent reply	other threads:[~2026-10-21 21:03 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-14 14:58 [PATCH] reftable/record: bound an object record's offset count by its length Matthew Suozzo via GitGitGadget
2026-10-19  7:46 ` Patrick Steinhardt
2026-10-19 17:14   ` m
2026-10-20  6:29     ` Patrick Steinhardt
2026-10-20 15:08       ` Junio C Hamano
2026-10-20 15:10         ` Patrick Steinhardt
2026-10-20 16:54       ` Aniket Gupta
2026-10-21 21:03 ` Matthew Suozzo via GitGitGadget [this message]
2026-10-21 21:03   ` [PATCH v2 1/2] Makefile: build the reftable record unit tests Matthew Suozzo via GitGitGadget
2026-10-21 21:03   ` [PATCH v2 2/2] reftable/basics: widen allocation size arguments to uintmax_t Matthew Suozzo via GitGitGadget

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=pull.2255.v2.git.1792616615.gitgitgadget@gmail.com \
    --to=gitgitgadget@gmail.com \
    --cc=aniketgupta3001@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=m@suozzo.co \
    --cc=ps@pks.im \
    /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