Skip to content

Commit 926af72

Browse files
authored
Merge pull request #4707 from Cykooz/fix_jpeg_magic_number
Replaced primitive "magic number" inside of JpegImagePlugin._accept() function by more correct version
2 parents 1bc67c9 + b7b4aac commit 926af72

2 files changed

Lines changed: 31 additions & 4 deletions

File tree

Tests/test_file_jpeg.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,14 @@
33
from io import BytesIO
44

55
import pytest
6-
from PIL import ExifTags, Image, ImageFile, JpegImagePlugin, features
6+
from PIL import (
7+
ExifTags,
8+
Image,
9+
ImageFile,
10+
JpegImagePlugin,
11+
UnidentifiedImageError,
12+
features,
13+
)
714

815
from .helper import (
916
assert_image,
@@ -709,6 +716,24 @@ def test_icc_after_SOF(self):
709716
with Image.open("Tests/images/icc-after-SOF.jpg") as im:
710717
assert im.info["icc_profile"] == b"profile"
711718

719+
def test_jpeg_magic_number(self):
720+
size = 4097
721+
buffer = BytesIO(b"\xFF" * size) # Many xFF bytes
722+
buffer.max_pos = 0
723+
orig_read = buffer.read
724+
725+
def read(n=-1):
726+
res = orig_read(n)
727+
buffer.max_pos = max(buffer.max_pos, buffer.tell())
728+
return res
729+
730+
buffer.read = read
731+
with pytest.raises(UnidentifiedImageError):
732+
Image.open(buffer)
733+
734+
# Assert the entire file has not been read
735+
assert 0 < buffer.max_pos < size
736+
712737

713738
@pytest.mark.skipif(not is_win32(), reason="Windows only")
714739
@skip_unless_feature("jpg")

src/PIL/JpegImagePlugin.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,8 @@ def DQT(self, marker):
323323

324324

325325
def _accept(prefix):
326-
return prefix[0:1] == b"\377"
326+
# Magic number was taken from https://en.wikipedia.org/wiki/JPEG
327+
return prefix[0:3] == b"\xFF\xD8\xFF"
327328

328329

329330
##
@@ -337,10 +338,11 @@ class JpegImageFile(ImageFile.ImageFile):
337338

338339
def _open(self):
339340

340-
s = self.fp.read(1)
341+
s = self.fp.read(3)
341342

342-
if i8(s) != 255:
343+
if s != b"\xFF\xD8\xFF":
343344
raise SyntaxError("not a JPEG file")
345+
s = b"\xFF"
344346

345347
# Create attributes
346348
self.bits = self.layers = 0

0 commit comments

Comments
 (0)