mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-07-10 16:22:22 +03:00
Merge pull request #4707 from Cykooz/fix_jpeg_magic_number
Replaced primitive "magic number" inside of JpegImagePlugin._accept() function by more correct version
This commit is contained in:
commit
926af72db3
|
@ -3,7 +3,14 @@ import re
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from PIL import ExifTags, Image, ImageFile, JpegImagePlugin, features
|
from PIL import (
|
||||||
|
ExifTags,
|
||||||
|
Image,
|
||||||
|
ImageFile,
|
||||||
|
JpegImagePlugin,
|
||||||
|
UnidentifiedImageError,
|
||||||
|
features,
|
||||||
|
)
|
||||||
|
|
||||||
from .helper import (
|
from .helper import (
|
||||||
assert_image,
|
assert_image,
|
||||||
|
@ -709,6 +716,24 @@ class TestFileJpeg:
|
||||||
with Image.open("Tests/images/icc-after-SOF.jpg") as im:
|
with Image.open("Tests/images/icc-after-SOF.jpg") as im:
|
||||||
assert im.info["icc_profile"] == b"profile"
|
assert im.info["icc_profile"] == b"profile"
|
||||||
|
|
||||||
|
def test_jpeg_magic_number(self):
|
||||||
|
size = 4097
|
||||||
|
buffer = BytesIO(b"\xFF" * size) # Many xFF bytes
|
||||||
|
buffer.max_pos = 0
|
||||||
|
orig_read = buffer.read
|
||||||
|
|
||||||
|
def read(n=-1):
|
||||||
|
res = orig_read(n)
|
||||||
|
buffer.max_pos = max(buffer.max_pos, buffer.tell())
|
||||||
|
return res
|
||||||
|
|
||||||
|
buffer.read = read
|
||||||
|
with pytest.raises(UnidentifiedImageError):
|
||||||
|
Image.open(buffer)
|
||||||
|
|
||||||
|
# Assert the entire file has not been read
|
||||||
|
assert 0 < buffer.max_pos < size
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif(not is_win32(), reason="Windows only")
|
@pytest.mark.skipif(not is_win32(), reason="Windows only")
|
||||||
@skip_unless_feature("jpg")
|
@skip_unless_feature("jpg")
|
||||||
|
|
|
@ -323,7 +323,8 @@ MARKER = {
|
||||||
|
|
||||||
|
|
||||||
def _accept(prefix):
|
def _accept(prefix):
|
||||||
return prefix[0:1] == b"\377"
|
# Magic number was taken from https://en.wikipedia.org/wiki/JPEG
|
||||||
|
return prefix[0:3] == b"\xFF\xD8\xFF"
|
||||||
|
|
||||||
|
|
||||||
##
|
##
|
||||||
|
@ -337,10 +338,11 @@ class JpegImageFile(ImageFile.ImageFile):
|
||||||
|
|
||||||
def _open(self):
|
def _open(self):
|
||||||
|
|
||||||
s = self.fp.read(1)
|
s = self.fp.read(3)
|
||||||
|
|
||||||
if i8(s) != 255:
|
if s != b"\xFF\xD8\xFF":
|
||||||
raise SyntaxError("not a JPEG file")
|
raise SyntaxError("not a JPEG file")
|
||||||
|
s = b"\xFF"
|
||||||
|
|
||||||
# Create attributes
|
# Create attributes
|
||||||
self.bits = self.layers = 0
|
self.bits = self.layers = 0
|
||||||
|
|
Loading…
Reference in New Issue
Block a user