mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-10-31 16:07:30 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from helper import unittest, PillowTestCase
 | |
| from PIL import Image, PngImagePlugin, ImageFile
 | |
| from io import BytesIO
 | |
| import zlib
 | |
| 
 | |
| TEST_FILE = "Tests/images/png_decompression_dos.png"
 | |
| 
 | |
| 
 | |
| class TestPngDos(PillowTestCase):
 | |
|     def test_ignore_dos_text(self):
 | |
|         ImageFile.LOAD_TRUNCATED_IMAGES = True
 | |
| 
 | |
|         try:
 | |
|             im = Image.open(TEST_FILE)
 | |
|             im.load()
 | |
|         finally:
 | |
|             ImageFile.LOAD_TRUNCATED_IMAGES = False
 | |
| 
 | |
|         for s in im.text.values():
 | |
|             self.assertLess(len(s), 1024*1024, "Text chunk larger than 1M")
 | |
| 
 | |
|         for s in im.info.values():
 | |
|             self.assertLess(len(s), 1024*1024, "Text chunk larger than 1M")
 | |
| 
 | |
|     def test_dos_text(self):
 | |
| 
 | |
|         try:
 | |
|             im = Image.open(TEST_FILE)
 | |
|             im.load()
 | |
|         except ValueError as msg:
 | |
|             self.assertTrue(msg, "Decompressed Data Too Large")
 | |
|             return
 | |
| 
 | |
|         for s in im.text.values():
 | |
|             self.assertLess(len(s), 1024*1024, "Text chunk larger than 1M")
 | |
| 
 | |
|     def test_dos_total_memory(self):
 | |
|         im = Image.new('L', (1, 1))
 | |
|         compressed_data = zlib.compress(b'a'*1024*1023)
 | |
| 
 | |
|         info = PngImagePlugin.PngInfo()
 | |
| 
 | |
|         for x in range(64):
 | |
|             info.add_text('t%s' % x, compressed_data, zip=True)
 | |
|             info.add_itxt('i%s' % x, compressed_data, zip=True)
 | |
| 
 | |
|         b = BytesIO()
 | |
|         im.save(b, 'PNG', pnginfo=info)
 | |
|         b.seek(0)
 | |
| 
 | |
|         try:
 | |
|             im2 = Image.open(b)
 | |
|         except ValueError as msg:
 | |
|             self.assertIn("Too much memory", msg)
 | |
|             return
 | |
| 
 | |
|         total_len = 0
 | |
|         for txt in im2.text.values():
 | |
|             total_len += len(txt)
 | |
|         self.assertLess(total_len, 64*1024*1024,
 | |
|                         "Total text chunks greater than 64M")
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     unittest.main()
 |