diff --git a/Tests/images/unknown_mode.j2k b/Tests/images/unknown_mode.j2k new file mode 100644 index 00000000000..38719fe2561 Binary files /dev/null and b/Tests/images/unknown_mode.j2k differ diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index ed7ea4fcfbc..95b9b967b0d 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -335,6 +335,12 @@ def test_issue_6194() -> None: assert im.getpixel((5, 5)) == 31 +def test_unknown_j2k_mode() -> None: + with pytest.raises(UnidentifiedImageError): + with Image.open("Tests/images/unknown_mode.j2k"): + pass + + def test_unbound_local() -> None: # prepatch, a malformed jp2 file could cause an UnboundLocalError exception. with pytest.raises(OSError): diff --git a/src/PIL/Jpeg2KImagePlugin.py b/src/PIL/Jpeg2KImagePlugin.py index 39eb1c20314..e50cd7799a3 100644 --- a/src/PIL/Jpeg2KImagePlugin.py +++ b/src/PIL/Jpeg2KImagePlugin.py @@ -97,7 +97,7 @@ def next_box_type(self) -> bytes: return tbox -def _parse_codestream(fp): +def _parse_codestream(fp) -> tuple[tuple[int, int], str]: """Parse the JPEG 2000 codestream to extract the size and component count from the SIZ marker segment, returning a PIL (size, mode) tuple.""" @@ -122,7 +122,8 @@ def _parse_codestream(fp): elif csiz == 4: mode = "RGBA" else: - mode = "" + msg = "unable to determine J2K image mode" + raise SyntaxError(msg) return size, mode @@ -237,10 +238,6 @@ def _open(self) -> None: msg = "not a JPEG 2000 file" raise SyntaxError(msg) - if self.size is None or not self.mode: - msg = "unable to determine size/mode" - raise SyntaxError(msg) - self._reduce = 0 self.layers = 0