Use _accept check in _open

This commit is contained in:
Andrew Murray 2025-05-10 20:33:29 +10:00
parent 0842985ebc
commit 0bf71a44ce

View File

@ -278,7 +278,6 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
_write_multiple_frames(im, fp) _write_multiple_frames(im, fp)
else: else:
_write_single_frame(im, fp) _write_single_frame(im, fp)
pass
riff_end = fp.tell() riff_end = fp.tell()
fp.seek(riff_offset - 4) fp.seek(riff_offset - 4)
@ -289,28 +288,29 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
class AniFile: class AniFile:
def __init__(self, buf: BytesIO) -> None: def __init__(self, fp: BytesIO) -> None:
if not _accept(fp.read(4)):
SyntaxError("Not an ANI file")
self.image_data = [] self.image_data = []
self.buf = buf self.buf = fp
self.rate = None self.rate = None
self.seq = None self.seq = None
self.anih = None self.anih = None
riff, size, fformat = struct.unpack("<4sI4s", buf.read(12)) size, fformat = struct.unpack("<I4s", fp.read(8))
if riff != b"RIFF":
SyntaxError("Not an ANI file")
self.riff = {"size": size, "fformat": fformat} self.riff = {"size": size, "fformat": fformat}
chunkOffset = buf.tell() chunkOffset = fp.tell()
while chunkOffset < self.riff["size"]: while chunkOffset < self.riff["size"]:
buf.seek(chunkOffset) fp.seek(chunkOffset)
chunk, size = struct.unpack("<4sI", buf.read(8)) chunk, size = struct.unpack("<4sI", fp.read(8))
chunkOffset = chunkOffset + size + 8 chunkOffset = chunkOffset + size + 8
if chunk == b"anih": if chunk == b"anih":
s = buf.read(36) s = fp.read(36)
self.anih = { self.anih = {
"size": i32(s), # Data structure size (in bytes) "size": i32(s), # Data structure size (in bytes)
"nFrames": i32(s, 4), # Number of frames "nFrames": i32(s, 4), # Number of frames
@ -325,24 +325,24 @@ class AniFile:
} }
if chunk == b"seq ": if chunk == b"seq ":
s = buf.read(size) s = fp.read(size)
self.seq = [i32(s, i * 4) for i in range(size // 4)] self.seq = [i32(s, i * 4) for i in range(size // 4)]
if chunk == b"rate": if chunk == b"rate":
s = buf.read(size) s = fp.read(size)
self.rate = [i32(s, i * 4) for i in range(size // 4)] self.rate = [i32(s, i * 4) for i in range(size // 4)]
if chunk == b"LIST": if chunk == b"LIST":
listtype = struct.unpack("<4s", buf.read(4))[0] listtype = struct.unpack("<4s", fp.read(4))[0]
if listtype != b"fram": if listtype != b"fram":
continue continue
listOffset = 0 listOffset = 0
while listOffset < size - 8: while listOffset < size - 8:
_, lSize = struct.unpack("<4sI", buf.read(8)) _, lSize = struct.unpack("<4sI", fp.read(8))
self.image_data.append({"offset": buf.tell(), "size": lSize}) self.image_data.append({"offset": fp.tell(), "size": lSize})
buf.read(lSize) fp.read(lSize)
listOffset = listOffset + lSize + 8 listOffset = listOffset + lSize + 8
if self.anih is None: if self.anih is None: