Skip to content

Commit bb20616

Browse files
committed
Use PyLongAsUnsignedLongMask for value conversion as is done in CPython zlib
1 parent 589aa76 commit bb20616

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

src/isal/isal_zlib.pyx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ from cpython.mem cimport PyMem_Malloc, PyMem_Free
3434
from cpython.buffer cimport PyBUF_READ, PyBUF_C_CONTIGUOUS, PyObject_GetBuffer, \
3535
PyBuffer_Release
3636
from cpython.bytes cimport PyBytes_FromStringAndSize
37-
37+
from cpython.long cimport PyLong_AsUnsignedLongMask
3838

3939
cdef extern from "<Python.h>":
4040
const Py_ssize_t PY_SSIZE_T_MAX
@@ -86,41 +86,43 @@ if ISAL_DEF_MAX_HIST_BITS > zlib.MAX_WBITS:
8686
"Please contact the developers.")
8787

8888

89-
def adler32(data, long long value = 1):
89+
def adler32(data, value = 1):
9090
"""
9191
Computes an Adler-32 checksum of *data*. Returns the checksum as unsigned
9292
32-bit integer.
9393
9494
:param data: Binary data (bytes, bytearray, memoryview).
9595
:param value: The starting value of the checksum.
9696
"""
97+
cdef unsigned long init = PyLong_AsUnsignedLongMask(value)
9798
cdef Py_buffer buffer_data
9899
cdef Py_buffer* buffer = &buffer_data
99100
if PyObject_GetBuffer(data, buffer, PyBUF_READ & PyBUF_C_CONTIGUOUS) != 0:
100101
raise TypeError("Failed to get buffer")
101102
try:
102103
if buffer.len > UINT64_MAX:
103104
raise ValueError("Data too big for adler32")
104-
return isal_adler32(value, <unsigned char*>buffer.buf, buffer.len)
105+
return isal_adler32(init, <unsigned char*>buffer.buf, buffer.len)
105106
finally:
106107
PyBuffer_Release(buffer)
107108

108-
def crc32(data, long long value = 0):
109+
def crc32(data, value = 0):
109110
"""
110111
Computes a CRC-32 checksum of *data*. Returns the checksum as unsigned
111112
32-bit integer.
112113
113114
:param data: Binary data (bytes, bytearray, memoryview).
114115
:param value: The starting value of the checksum.
115116
"""
117+
cdef unsigned long init = PyLong_AsUnsignedLongMask(value)
116118
cdef Py_buffer buffer_data
117119
cdef Py_buffer* buffer = &buffer_data
118120
if PyObject_GetBuffer(data, buffer, PyBUF_READ & PyBUF_C_CONTIGUOUS) != 0:
119121
raise TypeError("Failed to get buffer")
120122
try:
121123
if buffer.len > UINT64_MAX:
122124
raise ValueError("Data too big for adler32")
123-
return crc32_gzip_refl(value, <unsigned char*>buffer.buf, buffer.len)
125+
return crc32_gzip_refl(init, <unsigned char*>buffer.buf, buffer.len)
124126
finally:
125127
PyBuffer_Release(buffer)
126128

0 commit comments

Comments
 (0)