summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/gzip.py5
-rw-r--r--Modules/binascii.c18
-rw-r--r--Modules/zlibmodule.c4
-rw-r--r--setup.py20
4 files changed, 39 insertions, 8 deletions
diff --git a/Lib/gzip.py b/Lib/gzip.py
index e82cc61..45fae9f 100644
--- a/Lib/gzip.py
+++ b/Lib/gzip.py
@@ -17,7 +17,6 @@ READ, WRITE = 1, 2
def U32(i):
"""Return i as an unsigned integer, assuming it fits in 32 bits.
-
If it's >= 2GB when viewed as a 32-bit unsigned int, return a long.
"""
if i < 0:
@@ -320,7 +319,7 @@ class GzipFile:
if crc32 != self.crc:
raise IOError("CRC check failed %s != %s" % (hex(crc32),
hex(self.crc)))
- elif isize != self.size:
+ elif isize != (self.size & 0xffffffff):
raise IOError("Incorrect length of data produced")
def close(self):
@@ -328,7 +327,7 @@ class GzipFile:
self.fileobj.write(self.compress.flush())
write32u(self.fileobj, self.crc)
# self.size may exceed 2GB, or even 4GB
- write32u(self.fileobj, self.size)
+ write32u(self.fileobj, self.size & 0xffffffff)
self.fileobj = None
elif self.mode == READ:
self.fileobj = None
diff --git a/Modules/binascii.c b/Modules/binascii.c
index e09255c..034dc01 100644
--- a/Modules/binascii.c
+++ b/Modules/binascii.c
@@ -56,6 +56,9 @@
#define PY_SSIZE_T_CLEAN
#include "Python.h"
+#ifdef USE_ZLIB_CRC32
+#include "zlib.h"
+#endif
static PyObject *Error;
static PyObject *Incomplete;
@@ -776,6 +779,20 @@ binascii_crc_hqx(PyObject *self, PyObject *args)
PyDoc_STRVAR(doc_crc32,
"(data, oldcrc = 0) -> newcrc. Compute CRC-32 incrementally");
+#ifdef USE_ZLIB_CRC32
+/* This was taken from zlibmodule.c PyZlib_crc32 (but is PY_SSIZE_T_CLEAN) */
+static PyObject *
+binascii_crc32(PyObject *self, PyObject *args)
+{
+ uLong crc32val = 0; /* crc32(0L, Z_NULL, 0) */
+ Byte *buf;
+ int len;
+ if (!PyArg_ParseTuple(args, "s#|I:crc32", &buf, &len, &crc32val))
+ return NULL;
+ crc32val = crc32(crc32val, buf, len);
+ return PyLong_FromUnsignedLong(crc32val & 0xffffffffU);
+}
+#else /* USE_ZLIB_CRC32 */
/* Crc - 32 BIT ANSI X3.66 CRC checksum files
Also known as: ISO 3307
**********************************************************************|
@@ -914,6 +931,7 @@ binascii_crc32(PyObject *self, PyObject *args)
result = (crc ^ 0xFFFFFFFF);
return PyLong_FromUnsignedLong(result & 0xffffffff);
}
+#endif /* USE_ZLIB_CRC32 */
static PyObject *
diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c
index 3426ccf..cecb9cf 100644
--- a/Modules/zlibmodule.c
+++ b/Modules/zlibmodule.c
@@ -915,7 +915,7 @@ PyDoc_STRVAR(adler32__doc__,
static PyObject *
PyZlib_adler32(PyObject *self, PyObject *args)
{
- unsigned int adler32val = adler32(0L, Z_NULL, 0);
+ uLong adler32val = 1; /* adler32(0L, Z_NULL, 0) */
Byte *buf;
int len;
@@ -934,7 +934,7 @@ PyDoc_STRVAR(crc32__doc__,
static PyObject *
PyZlib_crc32(PyObject *self, PyObject *args)
{
- unsigned int crc32val = crc32(0L, Z_NULL, 0);
+ uLong crc32val = 0; /* crc32(0L, Z_NULL, 0) */
Byte *buf;
int len;
if (!PyArg_ParseTuple(args, "s#|I:crc32", &buf, &len, &crc32val))
diff --git a/setup.py b/setup.py
index 2365a0b..be34cd1 100644
--- a/setup.py
+++ b/setup.py
@@ -472,9 +472,6 @@ class PyBuildExt(build_ext):
# select(2); not on ancient System V
exts.append( Extension('select', ['selectmodule.c']) )
- # Helper module for various ascii-encoders
- exts.append( Extension('binascii', ['binascii.c']) )
-
# Fred Drake's interface to the Python parser
exts.append( Extension('parser', ['parsermodule.c']) )
@@ -1005,6 +1002,7 @@ class PyBuildExt(build_ext):
# You can upgrade zlib to version 1.1.4 yourself by going to
# http://www.gzip.org/zlib/
zlib_inc = find_file('zlib.h', [], inc_dirs)
+ have_zlib = False
if zlib_inc is not None:
zlib_h = zlib_inc[0] + '/zlib.h'
version = '"0.0.0"'
@@ -1026,6 +1024,7 @@ class PyBuildExt(build_ext):
exts.append( Extension('zlib', ['zlibmodule.c'],
libraries = ['z'],
extra_link_args = zlib_extra_link_args))
+ have_zlib = True
else:
missing.append('zlib')
else:
@@ -1033,6 +1032,21 @@ class PyBuildExt(build_ext):
else:
missing.append('zlib')
+ # Helper module for various ascii-encoders. Uses zlib for an optimized
+ # crc32 if we have it. Otherwise binascii uses its own.
+ if have_zlib:
+ extra_compile_args = ['-DUSE_ZLIB_CRC32']
+ libraries = ['z']
+ extra_link_args = zlib_extra_link_args
+ else:
+ extra_compile_args = []
+ libraries = []
+ extra_link_args = []
+ exts.append( Extension('binascii', ['binascii.c'],
+ extra_compile_args = extra_compile_args,
+ libraries = libraries,
+ extra_link_args = extra_link_args) )
+
# Gustavo Niemeyer's bz2 module.
if (self.compiler.find_library_file(lib_dirs, 'bz2')):
if sys.platform == "darwin":