Only close file handle in ImagePalette.save() if it was opened internally (#9444)

Co-authored-by: Andrew Murray <radarhere@users.noreply.github.com>
This commit is contained in:
Kadir Can Ozden 2026-02-24 10:01:24 +03:00 committed by GitHub
parent 81e0cf2bc4
commit 2fe7c42148
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 26 additions and 14 deletions

View File

@ -1,6 +1,6 @@
from __future__ import annotations
from io import BytesIO
import io
from pathlib import Path
import pytest
@ -23,6 +23,13 @@ def test_reload() -> None:
assert_image_equal(im.convert("RGB"), original.convert("RGB"))
def test_save_fp() -> None:
palette = ImagePalette.ImagePalette()
with io.StringIO() as fp:
palette.save(fp)
assert not fp.closed
def test_getcolor() -> None:
palette = ImagePalette.ImagePalette()
assert len(palette.palette) == 0
@ -204,7 +211,7 @@ def test_2bit_palette(tmp_path: Path) -> None:
def test_getpalette() -> None:
b = BytesIO(b"0 1\n1 2 3 4")
b = io.BytesIO(b"0 1\n1 2 3 4")
p = PaletteFile.PaletteFile(b)
palette, rawmode = p.getpalette()
@ -216,6 +223,6 @@ def test_invalid_palette() -> None:
with pytest.raises(OSError):
ImagePalette.load("Tests/images/hopper.jpg")
b = BytesIO(b"1" * 101)
b = io.BytesIO(b"1" * 101)
with pytest.raises(SyntaxError, match="bad palette file"):
PaletteFile.PaletteFile(b)

View File

@ -191,19 +191,24 @@ class ImagePalette:
if self.rawmode:
msg = "palette contains raw palette data"
raise ValueError(msg)
open_fp = False
if isinstance(fp, str):
fp = open(fp, "w")
fp.write("# Palette\n")
fp.write(f"# Mode: {self.mode}\n")
for i in range(256):
fp.write(f"{i}")
for j in range(i * len(self.mode), (i + 1) * len(self.mode)):
try:
fp.write(f" {self.palette[j]}")
except IndexError:
fp.write(" 0")
fp.write("\n")
fp.close()
open_fp = True
try:
fp.write("# Palette\n")
fp.write(f"# Mode: {self.mode}\n")
for i in range(256):
fp.write(f"{i}")
for j in range(i * len(self.mode), (i + 1) * len(self.mode)):
try:
fp.write(f" {self.palette[j]}")
except IndexError:
fp.write(" 0")
fp.write("\n")
finally:
if open_fp:
fp.close()
# --------------------------------------------------------------------