diff options
| author | Gregory P. Smith <greg@krypto.org> | 2022-03-20 19:28:15 (GMT) |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-03-20 19:28:15 (GMT) |
| commit | 9d1c4d69dbc800ac344565119337fcf490cdc800 (patch) | |
| tree | f27ebdb3ae2bfa27853b42def2df6f29625ac5df /Lib/test/test_binascii.py | |
| parent | 3ae975f1ac880c47d51cca6c9e305547bd365be7 (diff) | |
| download | cpython-9d1c4d69dbc800ac344565119337fcf490cdc800.zip cpython-9d1c4d69dbc800ac344565119337fcf490cdc800.tar.gz cpython-9d1c4d69dbc800ac344565119337fcf490cdc800.tar.bz2 | |
bpo-38256: Fix binascii.crc32() when inputs are 4+GiB (GH-32000)
When compiled with `USE_ZLIB_CRC32` defined (`configure` sets this on POSIX systems), `binascii.crc32(...)` failed to compute the correct value when the input data was >= 4GiB. Because the zlib crc32 API is limited to a 32-bit length.
This lines it up with the `zlib.crc32(...)` implementation that doesn't have that flaw.
**Performance:** This also adopts the same GIL releasing for larger inputs logic that `zlib.crc32` has, and causes the Windows build to always use zlib's crc32 instead of our slow C code as zlib is a required build dependency on Windows.
Diffstat (limited to 'Lib/test/test_binascii.py')
| -rw-r--r-- | Lib/test/test_binascii.py | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py index b5aa847..7087d7a 100644 --- a/Lib/test/test_binascii.py +++ b/Lib/test/test_binascii.py @@ -4,7 +4,7 @@ import unittest import binascii import array import re -from test.support import warnings_helper +from test.support import bigmemtest, _1G, _4G, warnings_helper # Note: "*_hex" functions are aliases for "(un)hexlify" @@ -441,6 +441,14 @@ class BytearrayBinASCIITest(BinASCIITest): class MemoryviewBinASCIITest(BinASCIITest): type2test = memoryview +class ChecksumBigBufferTestCase(unittest.TestCase): + """bpo-38256 - check that inputs >=4 GiB are handled correctly.""" + + @bigmemtest(size=_4G + 4, memuse=1, dry_run=False) + def test_big_buffer(self, size): + data = b"nyan" * (_1G + 1) + self.assertEqual(binascii.crc32(data), 1044521549) + if __name__ == "__main__": unittest.main() |
