2019-01-13 20:00:12 +03:00
|
|
|
from .helper import unittest, PillowTestCase
|
2014-08-26 05:39:57 +04:00
|
|
|
import sys
|
|
|
|
from PIL import Image
|
2014-08-27 10:03:07 +04:00
|
|
|
from io import BytesIO
|
2014-08-26 05:39:57 +04:00
|
|
|
|
|
|
|
# Limits for testing the leak
|
2019-06-13 18:53:42 +03:00
|
|
|
mem_limit = 1024 * 1048576
|
|
|
|
stack_size = 8 * 1048576
|
|
|
|
iterations = int((mem_limit / stack_size) * 2)
|
2014-08-26 05:39:57 +04:00
|
|
|
codecs = dir(Image.core)
|
|
|
|
test_file = "Tests/images/rgb_trns_ycbc.jp2"
|
|
|
|
|
2014-08-26 18:15:19 +04:00
|
|
|
|
2019-06-13 18:53:42 +03:00
|
|
|
@unittest.skipIf(sys.platform.startswith("win32"), "requires Unix or macOS")
|
2014-08-26 16:22:35 +04:00
|
|
|
class TestJpegLeaks(PillowTestCase):
|
2014-08-26 05:39:57 +04:00
|
|
|
def setUp(self):
|
|
|
|
if "jpeg2k_encoder" not in codecs or "jpeg2k_decoder" not in codecs:
|
2019-06-13 18:53:42 +03:00
|
|
|
self.skipTest("JPEG 2000 support not available")
|
2014-08-26 05:39:57 +04:00
|
|
|
|
2014-08-27 09:30:31 +04:00
|
|
|
def test_leak_load(self):
|
2014-08-26 07:43:11 +04:00
|
|
|
from resource import setrlimit, RLIMIT_AS, RLIMIT_STACK
|
2019-06-13 18:53:42 +03:00
|
|
|
|
2014-08-26 05:39:57 +04:00
|
|
|
setrlimit(RLIMIT_STACK, (stack_size, stack_size))
|
|
|
|
setrlimit(RLIMIT_AS, (mem_limit, mem_limit))
|
2015-04-08 14:12:37 +03:00
|
|
|
for _ in range(iterations):
|
2014-08-26 05:39:57 +04:00
|
|
|
with Image.open(test_file) as im:
|
|
|
|
im.load()
|
|
|
|
|
2014-08-27 09:30:31 +04:00
|
|
|
def test_leak_save(self):
|
|
|
|
from resource import setrlimit, RLIMIT_AS, RLIMIT_STACK
|
2019-06-13 18:53:42 +03:00
|
|
|
|
2014-08-27 09:30:31 +04:00
|
|
|
setrlimit(RLIMIT_STACK, (stack_size, stack_size))
|
|
|
|
setrlimit(RLIMIT_AS, (mem_limit, mem_limit))
|
2015-04-08 14:12:37 +03:00
|
|
|
for _ in range(iterations):
|
2014-08-27 09:30:31 +04:00
|
|
|
with Image.open(test_file) as im:
|
|
|
|
im.load()
|
2014-08-27 10:03:07 +04:00
|
|
|
test_output = BytesIO()
|
2014-08-27 09:30:31 +04:00
|
|
|
im.save(test_output, "JPEG2000")
|
|
|
|
test_output.seek(0)
|
2015-04-08 14:12:37 +03:00
|
|
|
test_output.read()
|
2014-08-27 09:30:31 +04:00
|
|
|
|
|
|
|
|
2019-06-13 18:53:42 +03:00
|
|
|
if __name__ == "__main__":
|
2014-08-26 05:39:57 +04:00
|
|
|
unittest.main()
|