Skip to content

Commit

Permalink
Merge 885297d into 41a7473
Browse files Browse the repository at this point in the history
  • Loading branch information
kkopachev committed Jun 29, 2016
2 parents 41a7473 + 885297d commit 6fd8c93
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
6 changes: 6 additions & 0 deletions PIL/PngImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,12 @@ def call(self, cid, pos, length):
def crc(self, cid, data):
"Read and verify checksum"

# Skip CRC checks for ancillary chunks if allowed to load truncated images
# 5th byte of first char is 1 [specs, section 5.4]
if ImageFile.LOAD_TRUNCATED_IMAGES and (i8(cid[0]) >> 5 & 1):
self.crc_skip(cid, data)
return

try:
crc1 = Image.core.crc32(data, Image.core.crc32(cid))
crc2 = i16(self.fp.read(2)), i16(self.fp.read(2))
Expand Down
30 changes: 30 additions & 0 deletions Tests/test_file_png.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from io import BytesIO

from PIL import Image
from PIL import ImageFile
from PIL import PngImagePlugin
import zlib

Expand Down Expand Up @@ -319,6 +320,35 @@ def test_verify_struct_error(self):
self.assertTrue(im.fp is not None)
self.assertRaises((IOError, SyntaxError), im.verify)

def test_verify_ignores_crc_error(self):
# check ignores crc errors in ancillary chunks

chunk_data = chunk(b'tEXt', b'spam')
broken_crc_chunk_data = chunk_data[:-1] + b'q' # break CRC

image_data = HEAD + broken_crc_chunk_data + TAIL
self.assertRaises(SyntaxError,
lambda: PngImagePlugin.PngImageFile(BytesIO(image_data)))

ImageFile.LOAD_TRUNCATED_IMAGES = True
try:
im = load(image_data)
self.assertTrue(im is not None)
finally:
ImageFile.LOAD_TRUNCATED_IMAGES = False

def test_verify_not_ignores_crc_error_in_required_chunk(self):
# check does not ignore crc errors in required chunks

image_data = MAGIC + IHDR[:-1] + b'q' + TAIL

ImageFile.LOAD_TRUNCATED_IMAGES = True
try:
self.assertRaises(SyntaxError,
lambda: PngImagePlugin.PngImageFile(BytesIO(image_data)))
finally:
ImageFile.LOAD_TRUNCATED_IMAGES = False


def test_roundtrip_dpi(self):
# Check dpi roundtripping
Expand Down

0 comments on commit 6fd8c93

Please sign in to comment.