You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/dev-python/python-lzo/files/python-lzo-1.12-fix-py3.10....

160 lines
4.2 KiB

diff --git a/lzomodule.c b/lzomodule.c
index b5fa542..e9ca432 100644
--- a/lzomodule.c
+++ b/lzomodule.c
@@ -31,6 +31,8 @@
#define MODULE_VERSION "1.12"
+#define PY_SSIZE_T_CLEAN
+
#include <Python.h>
#include <lzo/lzo1x.h>
@@ -83,7 +85,7 @@ compress(PyObject *dummy, PyObject *args)
lzo_uint in_len;
lzo_uint out_len;
lzo_uint new_len;
- int len;
+ Py_ssize_t len;
int level = 1;
int header = 1;
int err;
@@ -95,6 +97,16 @@ compress(PyObject *dummy, PyObject *args)
if (len < 0)
return NULL;
+ if (len > LZO_UINT_MAX) {
+ PyErr_SetString(LzoError, "Input size is larger than LZO_UINT_MAX");
+ return NULL;
+ }
+
+ if ((len + len / 16 + 64 + 3) > LZO_UINT_MAX) {
+ PyErr_SetString(LzoError, "Output size is larger than LZO_UINT_MAX");
+ return NULL;
+ }
+
in_len = len;
out_len = in_len + in_len / 16 + 64 + 3;
@@ -189,7 +201,7 @@ decompress(PyObject *dummy, PyObject *args)
lzo_uint in_len;
lzo_uint out_len;
lzo_uint new_len;
- int len;
+ Py_ssize_t len;
int buflen = -1;
int header = 1;
int err;
@@ -274,7 +286,7 @@ optimize(PyObject *dummy, PyObject *args)
lzo_uint in_len;
lzo_uint out_len;
lzo_uint new_len;
- int len;
+ Py_ssize_t len;
int err;
int header = 1;
int buflen = -1;
@@ -356,7 +368,7 @@ static PyObject *
adler32(PyObject *dummy, PyObject *args)
{
char *buf;
- int len;
+ Py_ssize_t len;
unsigned long val = 1; /* == lzo_adler32(0, NULL, 0); */
UNUSED(dummy);
@@ -392,7 +404,7 @@ static PyObject *
crc32(PyObject *dummy, PyObject *args)
{
char *buf;
- int len;
+ Py_ssize_t len;
unsigned long val = 0; /* == lzo_crc32(0, NULL, 0); */
UNUSED(dummy);
diff --git a/tests/test.py b/tests/test.py
index 9a96ce7..af761d9 100644
--- a/tests/test.py
+++ b/tests/test.py
@@ -96,11 +96,17 @@ def test_version():
def test_lzo():
yield gen, b"aaaaaaaaaaaaaaaaaaaaaaaa"
- yield gen_raw, b"aaaaaaaaaaaaaaaaaaaaaaaa"
yield gen, b"abcabcabcabcabcabcabcabc"
- yield gen_raw, b"abcabcabcabcabcabcabcabc"
yield gen, b"abcabcabcabcabcabcabcabc", 9
+
+
+def test_lzo_raw():
+ yield gen_raw, b"aaaaaaaaaaaaaaaaaaaaaaaa"
+ yield gen_raw, b"abcabcabcabcabcabcabcabc"
yield gen_raw, b"abcabcabcabcabcabcabcabc", 9
+
+
+def test_lzo_empty():
yield gen, b""
yield gen_raw, b""
@@ -113,41 +119,8 @@ def test_lzo_raw_big():
gen_raw(b" " * 131072)
-def main(args):
- # display version information and module documentation
- print("LZO version %s (0x%x), %s" % (lzo.LZO_VERSION_STRING, lzo.LZO_VERSION, lzo.LZO_VERSION_DATE))
- print(lzo.__file__)
- print()
- print(lzo.__doc__)
-
- # display additional module information
- ## print dir(lzo)
- ## print_modinfo()
-
- # compress some simple strings
- gen(b"aaaaaaaaaaaaaaaaaaaaaaaa")
- gen_raw(b"aaaaaaaaaaaaaaaaaaaaaaaa")
- gen(b"abcabcabcabcabcabcabcabc")
- gen_raw(b"abcabcabcabcabcabcabcabc")
- gen(b"abcabcabcabcabcabcabcabc", level=9)
- gen_raw(b"abcabcabcabcabcabcabcabc", level=9)
- gen(b" " * 131072)
- gen_raw(b" " * 131072)
- gen(b"")
- gen_raw(b"")
- print("Simple compression test passed.")
-
- test_version()
-
- # force an exception (because of invalid compressed data)
- assert issubclass(lzo.error, Exception)
- try:
- x = lzo.decompress("xx")
- except lzo.error:
- pass
- else:
- print("Exception handling does NOT work !")
- return 0
-
-if __name__ == '__main__':
- sys.exit(main(sys.argv))
+if sys.maxsize > 1<<32:
+ # This test raises OverflowError on 32-bit Pythons. Compressing
+ # this much data requires a 64-bit system.
+ def test_lzo_compress_extremely_big():
+ b = lzo.compress(bytes(bytearray((1024**3)*2)))
diff --git a/tests/util.py b/tests/util.py
index 0a2f4ed..c7bd5f0 100644
--- a/tests/util.py
+++ b/tests/util.py
@@ -45,7 +45,7 @@ def get_sys_path(p=None):
if p: p0 = p[0]
#
plat = get_platform()
- plat_specifier = "%s-%s" % (plat, sys.version[:3])
+ plat_specifier = "%s-%d.%d" % (plat, sys.version_info[0], sys.version_info[1])
##print plat, plat_specifier
#
for prefix in (p0, os.curdir, os.pardir,):