From e63333e5b1f5fe600889bc0b3aa248b4557eeec1 Mon Sep 17 00:00:00 2001 From: "Joshua D. Boyd" Date: Thu, 31 Oct 2019 22:18:48 -0400 Subject: [PATCH] More work on py_ssize_t_clean support. --- lzomodule.c | 19 ++++++++++++++----- tests/test.py | 11 +++++++++-- tox.ini | 2 +- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/lzomodule.c b/lzomodule.c index ec5c799..e9ca432 100644 --- a/lzomodule.c +++ b/lzomodule.c @@ -85,7 +85,6 @@ 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; @@ -98,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; @@ -192,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; @@ -277,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; @@ -359,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); @@ -395,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 df0c355..7b386b7 100644 --- a/tests/test.py +++ b/tests/test.py @@ -96,10 +96,13 @@ 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 @@ -114,3 +117,7 @@ def test_lzo_big(): def test_lzo_raw_big(): gen_raw(b" " * 131072) + + +def test_lzo_compress_extremely_big(): + b = lzo.compress(bytes(bytearray((1024**3)*2))) diff --git a/tox.ini b/tox.ini index 2b6468c..0e79dd1 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,6 @@ # content of: tox.ini , put in same dir as setup.py [tox] -envlist = py27,py35 +envlist = py27,py37 [testenv] deps= nose