Pillow/Tests/test_decompression_bomb.py

86 lines
2.8 KiB
Python
Raw Normal View History

2014-05-27 13:40:52 +04:00
from PIL import Image
from .helper import PillowTestCase, hopper
2014-09-05 13:36:24 +04:00
TEST_FILE = "Tests/images/hopper.ppm"
2014-05-27 13:40:52 +04:00
2014-06-23 12:22:25 +04:00
ORIGINAL_LIMIT = Image.MAX_IMAGE_PIXELS
2014-05-27 13:40:52 +04:00
class TestDecompressionBomb(PillowTestCase):
2014-06-23 12:22:25 +04:00
def tearDown(self):
Image.MAX_IMAGE_PIXELS = ORIGINAL_LIMIT
def test_no_warning_small_file(self):
# Implicit assert: no warning.
# A warning would cause a failure.
2014-09-05 13:36:24 +04:00
Image.open(TEST_FILE)
2014-05-27 13:40:52 +04:00
def test_no_warning_no_limit(self):
# Arrange
# Turn limit off
Image.MAX_IMAGE_PIXELS = None
self.assertIsNone(Image.MAX_IMAGE_PIXELS)
2014-05-27 13:40:52 +04:00
# Act / Assert
# Implicit assert: no warning.
# A warning would cause a failure.
2014-09-05 13:36:24 +04:00
Image.open(TEST_FILE)
2014-05-27 13:40:52 +04:00
def test_warning(self):
# Set limit to trigger warning on the test file
2018-03-06 11:53:07 +03:00
Image.MAX_IMAGE_PIXELS = 128 * 128 - 1
self.assertEqual(Image.MAX_IMAGE_PIXELS, 128 * 128 - 1)
2014-05-27 13:40:52 +04:00
2019-06-13 18:53:42 +03:00
self.assert_warning(Image.DecompressionBombWarning, Image.open, TEST_FILE)
2017-02-17 18:07:14 +03:00
def test_exception(self):
# Set limit to trigger exception on the test file
2018-03-06 11:53:07 +03:00
Image.MAX_IMAGE_PIXELS = 64 * 128 - 1
self.assertEqual(Image.MAX_IMAGE_PIXELS, 64 * 128 - 1)
2019-06-13 18:53:42 +03:00
self.assertRaises(Image.DecompressionBombError, lambda: Image.open(TEST_FILE))
2019-09-29 07:14:38 +03:00
def test_exception_ico(self):
with self.assertRaises(Image.DecompressionBombError):
Image.open("Tests/images/decompression_bomb.ico")
def test_exception_gif(self):
with self.assertRaises(Image.DecompressionBombError):
Image.open("Tests/images/decompression_bomb.gif")
2018-03-03 12:54:00 +03:00
2017-02-17 18:07:14 +03:00
class TestDecompressionCrop(PillowTestCase):
def setUp(self):
self.src = hopper()
Image.MAX_IMAGE_PIXELS = self.src.height * self.src.width * 4 - 1
2017-02-17 18:07:14 +03:00
def tearDown(self):
Image.MAX_IMAGE_PIXELS = ORIGINAL_LIMIT
def testEnlargeCrop(self):
# Crops can extend the extents, therefore we should have the
# same decompression bomb warnings on them.
box = (0, 0, self.src.width * 2, self.src.height * 2)
2019-06-13 18:53:42 +03:00
self.assert_warning(Image.DecompressionBombWarning, self.src.crop, box)
2014-05-27 13:40:52 +04:00
2018-08-23 16:40:46 +03:00
def test_crop_decompression_checks(self):
im = Image.new("RGB", (100, 100))
2019-06-13 18:53:42 +03:00
good_values = ((-9999, -9999, -9990, -9990), (-999, -999, -990, -990))
2018-08-23 16:40:46 +03:00
2019-06-13 18:53:42 +03:00
warning_values = ((-160, -160, 99, 99), (160, 160, -99, -99))
2018-08-23 16:40:46 +03:00
2019-06-13 18:53:42 +03:00
error_values = ((-99909, -99990, 99999, 99999), (99909, 99990, -99999, -99999))
2018-08-23 16:40:46 +03:00
for value in good_values:
2018-09-26 14:09:31 +03:00
self.assertEqual(im.crop(value).size, (9, 9))
2018-08-23 16:40:46 +03:00
for value in warning_values:
2018-09-26 14:09:31 +03:00
self.assert_warning(Image.DecompressionBombWarning, im.crop, value)
2018-08-23 16:40:46 +03:00
for value in error_values:
2018-09-26 14:09:31 +03:00
with self.assertRaises(Image.DecompressionBombError):
2018-08-23 16:40:46 +03:00
im.crop(value)