]> git.ipfire.org Git - thirdparty/git.git/commitdiff
hash-object: demonstrate a >4GB/LLP64 problem
authorPhilip Oakley <philipoakley@iee.email>
Tue, 16 Jun 2026 14:49:52 +0000 (14:49 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 16 Jun 2026 16:02:32 +0000 (09:02 -0700)
On LLP64 systems, such as Windows, the size of `long`, `int`, etc. is
only 32 bits (for backward compatibility). Git's use of `unsigned long`
for file memory sizes in many places, rather than size_t, limits the
handling of large files on LLP64 systems (commonly given as `>4GB`).

Provide a minimum test for handling a >4GB file. The `hash-object`
command, with the  `--literally` and without `-w` option avoids
writing the object, either loose or packed. This avoids the code paths
hitting the `bigFileThreshold` config test code, the zlib code, and the
pack code.

Subsequent patches will walk the test's call chain, converting types to
`size_t` (which is larger in LLP64 data models) where appropriate.

Signed-off-by: Philip Oakley <philipoakley@iee.email>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t1007-hash-object.sh

index de076293b62a767c2db01be3c7b660445922bc73..7867fd1dbf940cc9bc33c7579de642c960dcdfa4 100755 (executable)
@@ -49,6 +49,9 @@ test_expect_success 'setup' '
 
        example sha1:ddd3f836d3e3fbb7ae289aa9ae83536f76956399
        example sha256:b44fe1fe65589848253737db859bd490453510719d7424daab03daf0767b85ae
+
+       large5GB sha1:0be2be10a4c8764f32c4bf372a98edc731a4b204
+       large5GB sha256:dc18ca621300c8d3cfa505a275641ebab00de189859e022a975056882d313e64
        EOF
 '
 
@@ -258,4 +261,12 @@ test_expect_success '--stdin outside of repository (uses default hash)' '
        test_cmp expect actual
 '
 
+test_expect_failure EXPENSIVE,SIZE_T_IS_64BIT,!LONG_IS_64BIT \
+               'files over 4GB hash literally' '
+       test-tool genzeros $((5*1024*1024*1024)) >big &&
+       test_oid large5GB >expect &&
+       git hash-object --stdin --literally <big >actual &&
+       test_cmp expect actual
+'
+
 test_done