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
next prev 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