mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
[3.11] gh-105967: Work around a macOS bug, limit zlib C library crc32 API calls to 1gig (GH-112615) (#112725)
gh-105967: Work around a macOS bug, limit zlib C library crc32 API calls to 1gig (GH-112615)
Work around a macOS bug, limit zlib crc32 calls to 1GiB.
Without this, `zlib.crc32` and `binascii.crc32` could produce incorrect
results on multi-gigabyte inputs depending on the macOS version's Apple
supplied zlib implementation.
(cherry picked from commit 4eddb4c9d9
)
Co-authored-by: Gregory P. Smith <greg@krypto.org>
This commit is contained in:
parent
8dbda1cf3e
commit
be4acc7040
3 changed files with 30 additions and 10 deletions
|
@ -1444,12 +1444,20 @@ zlib_crc32_impl(PyObject *module, Py_buffer *data, unsigned int value)
|
|||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
/* Avoid truncation of length for very large buffers. crc32() takes
|
||||
length as an unsigned int, which may be narrower than Py_ssize_t. */
|
||||
while ((size_t)len > UINT_MAX) {
|
||||
value = crc32(value, buf, UINT_MAX);
|
||||
buf += (size_t) UINT_MAX;
|
||||
len -= (size_t) UINT_MAX;
|
||||
length as an unsigned int, which may be narrower than Py_ssize_t.
|
||||
We further limit size due to bugs in Apple's macOS zlib.
|
||||
See https://github.com/python/cpython/issues/105967.
|
||||
*/
|
||||
#define ZLIB_CRC_CHUNK_SIZE 0x40000000
|
||||
#if ZLIB_CRC_CHUNK_SIZE > INT_MAX
|
||||
# error "unsupported less than 32-bit platform?"
|
||||
#endif
|
||||
while ((size_t)len > ZLIB_CRC_CHUNK_SIZE) {
|
||||
value = crc32(value, buf, ZLIB_CRC_CHUNK_SIZE);
|
||||
buf += (size_t) ZLIB_CRC_CHUNK_SIZE;
|
||||
len -= (size_t) ZLIB_CRC_CHUNK_SIZE;
|
||||
}
|
||||
#undef ZLIB_CRC_CHUNK_SIZE
|
||||
value = crc32(value, buf, (unsigned int)len);
|
||||
Py_END_ALLOW_THREADS
|
||||
} else {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue