Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 46 additions & 3 deletions Tests/test_file_gbr.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
from __future__ import annotations

from io import BytesIO

import pytest

from PIL import GbrImagePlugin, Image
from PIL import GbrImagePlugin, Image, _binary

from .helper import assert_image_equal_tofile

Expand Down Expand Up @@ -31,8 +33,49 @@ def test_multiple_load_operations() -> None:
assert_image_equal_tofile(im, "Tests/images/gbr.png")


def create_gbr_image(info: dict[str, int] = {}, magic_number=b"") -> BytesIO:
return BytesIO(
b"".join(
_binary.o32be(i)
for i in [
info.get("header_size", 20),
info.get("version", 1),
info.get("width", 1),
info.get("height", 1),
info.get("color_depth", 1),
]
)
+ magic_number
)


def test_invalid_file() -> None:
invalid_file = "Tests/images/flower.jpg"
for f in [
create_gbr_image({"header_size": 0}),
create_gbr_image({"width": 0}),
create_gbr_image({"height": 0}),
]:
with pytest.raises(SyntaxError, match="not a GIMP brush"):
GbrImagePlugin.GbrImageFile(f)

with pytest.raises(SyntaxError):
invalid_file = "Tests/images/flower.jpg"
with pytest.raises(SyntaxError, match="Unsupported GIMP brush version"):
GbrImagePlugin.GbrImageFile(invalid_file)


def test_unsupported_gimp_brush() -> None:
f = create_gbr_image({"color_depth": 2})
with pytest.raises(SyntaxError, match="Unsupported GIMP brush color depth: 2"):
GbrImagePlugin.GbrImageFile(f)


def test_bad_magic_number() -> None:
f = create_gbr_image({"version": 2}, magic_number=b"badm")
with pytest.raises(SyntaxError, match="not a GIMP brush, bad magic number"):
GbrImagePlugin.GbrImageFile(f)


def test_L() -> None:
f = create_gbr_image()
with Image.open(f) as im:
assert im.mode == "L"
6 changes: 2 additions & 4 deletions src/PIL/GbrImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def _open(self) -> None:
width = i32(self.fp.read(4))
height = i32(self.fp.read(4))
color_depth = i32(self.fp.read(4))
if width <= 0 or height <= 0:
if width == 0 or height == 0:
msg = "not a GIMP brush"
raise SyntaxError(msg)
if color_depth not in (1, 4):
Expand All @@ -71,7 +71,7 @@ def _open(self) -> None:
raise SyntaxError(msg)
self.info["spacing"] = i32(self.fp.read(4))

comment = self.fp.read(comment_length)[:-1]
self.info["comment"] = self.fp.read(comment_length)[:-1]

if color_depth == 1:
self._mode = "L"
Expand All @@ -80,8 +80,6 @@ def _open(self) -> None:

self._size = width, height

self.info["comment"] = comment

# Image might not be small
Image._decompression_bomb_check(self.size)

Expand Down
Loading