diff -r 66ca2fe3058b Modules/zlibmodule.c --- a/Modules/zlibmodule.c Mon Nov 01 06:10:44 2010 +0100 +++ b/Modules/zlibmodule.c Mon Nov 01 10:56:53 2010 +0200 @@ -931,7 +931,17 @@ /* Releasing the GIL for very small buffers is inefficient and may lower performance */ if (pbuf.len > 1024*5) { + void *buf = pbuf.buf; + Py_ssize_t len = pbuf.len; + Py_BEGIN_ALLOW_THREADS + /* Avoid truncation of length for very large buffers. adler32() takes + length as an unsigned int, which may be narrower than Py_ssize_t. */ + while (len > (Py_ssize_t)UINT_MAX) { + adler32val = adler32(adler32val, buf, UINT_MAX); + buf += UINT_MAX; + len -= UINT_MAX; + } adler32val = adler32(adler32val, pbuf.buf, pbuf.len); Py_END_ALLOW_THREADS } else { @@ -959,8 +969,18 @@ /* Releasing the GIL for very small buffers is inefficient and may lower performance */ if (pbuf.len > 1024*5) { + void *buf = pbuf.buf; + Py_ssize_t len = pbuf.len; + Py_BEGIN_ALLOW_THREADS - signed_val = crc32(crc32val, pbuf.buf, pbuf.len); + /* Avoid truncation of length for very large buffers. crc32() takes + length as an unsigned int, which may be narrower than Py_ssize_t. */ + while (len > (Py_ssize_t)UINT_MAX) { + crc32val = crc32(crc32val, buf, UINT_MAX); + buf += UINT_MAX; + len -= UINT_MAX; + } + signed_val = crc32(crc32val, buf, len); Py_END_ALLOW_THREADS } else { signed_val = crc32(crc32val, pbuf.buf, pbuf.len);