From: "Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Patrick Steinhardt <ps@pks.im>,
Johannes Schindelin <johannes.schindelin@gmx.de>
Subject: [PATCH v2 00/12] Next size_t stop: pack-objects/delta
Date: Wed, 05 Aug 2026 16:14:27 +0000 [thread overview]
Message-ID: <pull.2175.v2.git.1785946479.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2175.git.1783615780.gitgitgadget@gmail.com>
This patch series continues the effort to stop using unsigned long where
size_t should have been used in the first place. This makes a difference on
64-bit Windows, where unsigned long is 32-bit.
With these fixes, the pack-objects machinery works as intended on 64-bit
Windows (and any other 64-bit platform where unsigned long isn't 64-bit).
Changes since v1:
* The return value of sizeof_delta_index() is now included in the unsigned
long -> size_t work.
* To assign correct values to the now-widened max_delta_cache_size, a new
pair of helpers are introduced and used: git_parse_size_t() and
git_config_size_t()
* There are now two references regarding the provenance of the
deflateBound() formula in the corresponding commit message.
Johannes Schindelin (12):
diff-delta: widen `struct delta_index`' size fields to `size_t`
delta: widen `create_delta_index()` parameter to `size_t`
pack-objects: widen delta-cache accounting to `size_t`
pack-objects: widen `free_unpacked()` return to `size_t`
pack-objects: widen `mem_usage` and `try_delta()`'s out-param to
`size_t`
delta: widen `create_delta()` and `diff_delta()` to `size_t`
packfile, git-zlib: widen `use_pack()` and zstream avail fields to
`size_t`
archive-zip: widen `zlib_deflate_raw()`'s maxsize local to `size_t`
diff: widen `deflate_it()`'s bound local from int to `size_t`
http-push: widen `start_put()`'s size local from `ssize_t` to `size_t`
t/helper/test-pack-deltas: widen `do_compress()`'s maxsize local to
`size_t`
git-zlib: widen `git_deflate_bound()` to `size_t`
archive-zip.c | 2 +-
builtin/fast-import.c | 6 ++++--
builtin/pack-objects.c | 32 +++++++++++++++++---------------
config.c | 9 +++++++++
config.h | 3 +++
delta.h | 14 +++++++-------
diff-delta.c | 14 +++++++-------
diff.c | 6 ++++--
git-zlib.c | 16 ++++++++++++++--
git-zlib.h | 6 +++---
http-push.c | 2 +-
pack-check.c | 4 ++--
packfile.c | 4 ++--
packfile.h | 3 ++-
parse.c | 9 +++++++++
parse.h | 1 +
t/helper/test-delta.c | 2 +-
t/helper/test-pack-deltas.c | 7 ++++---
18 files changed, 91 insertions(+), 49 deletions(-)
base-commit: f85a7e662054a7b0d9070e432508831afa214b47
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2175%2Fdscho%2Fsize-t%2Fpack-objects-delta-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2175/dscho/size-t/pack-objects-delta-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/2175
Range-diff vs v1:
1: 69c2c21f05 ! 1: 0012c1007b diff-delta: widen `struct delta_index`' size fields to `size_t`
@@ Commit message
bits on Windows because the public API around it still truncates.
Splitting it out keeps the API-change commit focused on caller updates.
+ Since the `memsize` attribute is returned by the `sizeof_delta_index()`
+ function verbatim, that function's return type is adjusted, too.
+
Assisted-by: Opus 4.7
+ Helped-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
+ ## delta.h ##
+@@ delta.h: void free_delta_index(struct delta_index *index);
+ *
+ * Given pointer must be what create_delta_index() returned, or NULL.
+ */
+-unsigned long sizeof_delta_index(struct delta_index *index);
++size_t sizeof_delta_index(struct delta_index *index);
+
+ /*
+ * create_delta: create a delta from given index for the given buffer
+
## diff-delta.c ##
@@ diff-delta.c: struct unpacked_index_entry {
};
@@ diff-delta.c: struct delta_index * create_delta_index(const void *buf, unsigned
if (!buf || !bufsize)
return NULL;
+@@ diff-delta.c: void free_delta_index(struct delta_index *index)
+ free(index);
+ }
+
+-unsigned long sizeof_delta_index(struct delta_index *index)
++size_t sizeof_delta_index(struct delta_index *index)
+ {
+ if (index)
+ return index->memsize;
2: d92a5d4dec = 2: 75500c5abb delta: widen `create_delta_index()` parameter to `size_t`
3: 4ef2886549 ! 3: 5b54041baf pack-objects: widen delta-cache accounting to `size_t`
@@ Commit message
shims, which becomes possible once 1create_delta()` and `diff_delta()`
are widened in a later commit.
+ Note: since `max_delta_cache_size` changes data type to `size_t`, a pair
+ of new helpers is introduced to parse config values of that type, too.
+
Assisted-by: Opus 4.7
+ Helped-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
## builtin/pack-objects.c ##
@@ builtin/pack-objects.c: struct unpacked {
{
if (max_delta_cache_size && delta_cache_size + delta_size > max_delta_cache_size)
return 0;
+@@ builtin/pack-objects.c: static int git_pack_config(const char *k, const char *v,
+ return 0;
+ }
+ if (!strcmp(k, "pack.deltacachesize")) {
+- max_delta_cache_size = git_config_int(k, v, ctx->kvi);
++ max_delta_cache_size = git_config_size_t(k, v, ctx->kvi);
+ return 0;
+ }
+ if (!strcmp(k, "pack.deltacachelimit")) {
+
+ ## config.c ##
+@@ config.c: ssize_t git_config_ssize_t(const char *name, const char *value,
+ return ret;
+ }
+
++size_t git_config_size_t(const char *name, const char *value,
++ const struct key_value_info *kvi)
++{
++ size_t ret;
++ if (!git_parse_size_t(value, &ret))
++ die_bad_number(name, value, kvi);
++ return ret;
++}
++
+ double git_config_double(const char *name, const char *value,
+ const struct key_value_info *kvi)
+ {
+
+ ## config.h ##
+@@ config.h: unsigned long git_config_ulong(const char *, const char *,
+ ssize_t git_config_ssize_t(const char *, const char *,
+ const struct key_value_info *);
+
++size_t git_config_size_t(const char *, const char *,
++ const struct key_value_info *);
++
+ /**
+ * Identically to `git_config_double`, but for double-precision floating point
+ * values.
+
+ ## parse.c ##
+@@ parse.c: int git_parse_ssize_t(const char *value, ssize_t *ret)
+ return 1;
+ }
+
++int git_parse_size_t(const char *value, size_t *ret)
++{
++ uintmax_t tmp;
++ if (!git_parse_unsigned(value, &tmp, maximum_signed_value_of_type(size_t)))
++ return 0;
++ *ret = tmp;
++ return 1;
++}
++
+ int git_parse_double(const char *value, double *ret)
+ {
+ char *end;
+
+ ## parse.h ##
+@@
+ int git_parse_signed(const char *value, intmax_t *ret, intmax_t max);
+ int git_parse_unsigned(const char *value, uintmax_t *ret, uintmax_t max);
+ int git_parse_ssize_t(const char *, ssize_t *);
++int git_parse_size_t(const char *, size_t *);
+ int git_parse_ulong(const char *, unsigned long *);
+ int git_parse_uint(const char *value, unsigned int *ret);
+ int git_parse_int(const char *value, int *ret);
4: 07d01200a4 = 4: 9850de1a91 pack-objects: widen `free_unpacked()` return to `size_t`
5: 7dca160102 = 5: c301958284 pack-objects: widen `mem_usage` and `try_delta()`'s out-param to `size_t`
6: e1ae83ba03 ! 6: cfbf6c9567 delta: widen `create_delta()` and `diff_delta()` to `size_t`
@@ builtin/pack-objects.c: static int try_delta(struct unpacked *trg, struct unpack
void *delta_buf;
## delta.h ##
-@@ delta.h: unsigned long sizeof_delta_index(struct delta_index *index);
+@@ delta.h: size_t sizeof_delta_index(struct delta_index *index);
*/
void *
create_delta(const struct delta_index *index,
@@ delta.h: create_delta(const struct delta_index *index,
if (index) {
## diff-delta.c ##
-@@ diff-delta.c: unsigned long sizeof_delta_index(struct delta_index *index)
+@@ diff-delta.c: size_t sizeof_delta_index(struct delta_index *index)
void *
create_delta(const struct delta_index *index,
7: 8353bc03c1 = 7: ca928b4579 packfile, git-zlib: widen `use_pack()` and zstream avail fields to `size_t`
8: acffd232ac = 8: 9f379ee7aa archive-zip: widen `zlib_deflate_raw()`'s maxsize local to `size_t`
9: b89d28c8aa = 9: ff103a0ee1 diff: widen `deflate_it()`'s bound local from int to `size_t`
10: 2d4d19c5fb = 10: c701d2f9b2 http-push: widen `start_put()`'s size local from `ssize_t` to `size_t`
11: 617960d9ca = 11: e6175d2d87 t/helper/test-pack-deltas: widen `do_compress()`'s maxsize local to `size_t`
12: ab911cf556 ! 12: 762e716afe git-zlib: widen `git_deflate_bound()` to `size_t`
@@ Commit message
For inputs above zlib's `uLong` range (i.e. >4 GiB on platforms where
`uLong` is 32-bit, notably 64-bit Windows), defer to zlib's stored-block
- formula (the same fallback it would itself use for an unknown stream
- state) plus the worst-case wrapper overhead. The existing path through
+ formula (the same fallback it would itself use, see
+ https://github.com/madler/zlib/blob/v1.3.2/deflate.c#L832-L928 keeping
+ in mind that for large sizes, the `storelen` would be relevant, also
+ compare with https://github.com/madler/zlib/issues/549 for a fuller
+ story) plus the worst-case wrapper overhead. The existing path through
`deflateBound()` is unchanged for inputs that fit.
Assisted-by: Opus 4.7
--
gitgitgadget
next prev parent reply other threads:[~2026-08-05 16:14 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-09 16:49 [PATCH 00/12] Next size_t stop: pack-objects/delta Johannes Schindelin via GitGitGadget
2026-07-09 16:49 ` [PATCH 01/12] diff-delta: widen `struct delta_index`' size fields to `size_t` Johannes Schindelin via GitGitGadget
2026-08-05 9:22 ` Patrick Steinhardt
2026-08-05 13:51 ` Johannes Schindelin
2026-07-09 16:49 ` [PATCH 02/12] delta: widen `create_delta_index()` parameter " Johannes Schindelin via GitGitGadget
2026-07-09 16:49 ` [PATCH 03/12] pack-objects: widen delta-cache accounting " Johannes Schindelin via GitGitGadget
2026-08-05 9:23 ` Patrick Steinhardt
2026-08-05 13:52 ` Johannes Schindelin
2026-07-09 16:49 ` [PATCH 04/12] pack-objects: widen `free_unpacked()` return " Johannes Schindelin via GitGitGadget
2026-08-05 9:23 ` Patrick Steinhardt
2026-07-09 16:49 ` [PATCH 05/12] pack-objects: widen `mem_usage` and `try_delta()`'s out-param " Johannes Schindelin via GitGitGadget
2026-07-09 16:49 ` [PATCH 06/12] delta: widen `create_delta()` and `diff_delta()` " Johannes Schindelin via GitGitGadget
2026-08-05 9:23 ` Patrick Steinhardt
2026-07-09 16:49 ` [PATCH 07/12] packfile, git-zlib: widen `use_pack()` and zstream avail fields " Johannes Schindelin via GitGitGadget
2026-07-09 16:49 ` [PATCH 08/12] archive-zip: widen `zlib_deflate_raw()`'s maxsize local " Johannes Schindelin via GitGitGadget
2026-07-09 16:49 ` [PATCH 09/12] diff: widen `deflate_it()`'s bound local from int " Johannes Schindelin via GitGitGadget
2026-07-09 16:49 ` [PATCH 10/12] http-push: widen `start_put()`'s size local from `ssize_t` " Johannes Schindelin via GitGitGadget
2026-07-09 16:49 ` [PATCH 11/12] t/helper/test-pack-deltas: widen `do_compress()`'s maxsize local " Johannes Schindelin via GitGitGadget
2026-07-09 16:49 ` [PATCH 12/12] git-zlib: widen `git_deflate_bound()` " Johannes Schindelin via GitGitGadget
2026-08-05 9:23 ` Patrick Steinhardt
2026-08-05 13:58 ` Johannes Schindelin
2026-08-05 16:14 ` Johannes Schindelin via GitGitGadget [this message]
2026-08-05 16:14 ` [PATCH v2 01/12] diff-delta: widen `struct delta_index`' size fields " Johannes Schindelin via GitGitGadget
2026-08-06 6:15 ` Patrick Steinhardt
2026-08-05 16:14 ` [PATCH v2 02/12] delta: widen `create_delta_index()` parameter " Johannes Schindelin via GitGitGadget
2026-08-05 16:14 ` [PATCH v2 03/12] pack-objects: widen delta-cache accounting " Johannes Schindelin via GitGitGadget
2026-08-05 16:14 ` [PATCH v2 04/12] pack-objects: widen `free_unpacked()` return " Johannes Schindelin via GitGitGadget
2026-08-05 16:14 ` [PATCH v2 05/12] pack-objects: widen `mem_usage` and `try_delta()`'s out-param " Johannes Schindelin via GitGitGadget
2026-08-05 16:14 ` [PATCH v2 06/12] delta: widen `create_delta()` and `diff_delta()` " Johannes Schindelin via GitGitGadget
2026-08-05 16:14 ` [PATCH v2 07/12] packfile, git-zlib: widen `use_pack()` and zstream avail fields " Johannes Schindelin via GitGitGadget
2026-08-07 21:41 ` Junio C Hamano
2026-08-07 22:06 ` Junio C Hamano
2026-08-05 16:14 ` [PATCH v2 08/12] archive-zip: widen `zlib_deflate_raw()`'s maxsize local " Johannes Schindelin via GitGitGadget
2026-08-05 16:14 ` [PATCH v2 09/12] diff: widen `deflate_it()`'s bound local from int " Johannes Schindelin via GitGitGadget
2026-08-05 16:14 ` [PATCH v2 10/12] http-push: widen `start_put()`'s size local from `ssize_t` " Johannes Schindelin via GitGitGadget
2026-08-05 16:14 ` [PATCH v2 11/12] t/helper/test-pack-deltas: widen `do_compress()`'s maxsize local " Johannes Schindelin via GitGitGadget
2026-08-05 16:14 ` [PATCH v2 12/12] git-zlib: widen `git_deflate_bound()` " Johannes Schindelin via GitGitGadget
2026-08-06 6:15 ` [PATCH v2 00/12] Next size_t stop: pack-objects/delta Patrick Steinhardt
2026-08-06 17:30 ` Junio C Hamano
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.2175.v2.git.1785946479.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=johannes.schindelin@gmx.de \
--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