Skip to content

Commit 92048cf

Browse files
committed
Only read a maximum of 100 bytes at a time
1 parent a2ced61 commit 92048cf

File tree

1 file changed

+18
-6
lines changed

1 file changed

+18
-6
lines changed

src/PIL/ImtImagePlugin.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,32 +39,44 @@ def _open(self):
3939
# Quick rejection: if there's not a LF among the first
4040
# 100 bytes, this is (probably) not a text header.
4141

42-
if b"\n" not in self.fp.read(100):
42+
buffer = self.fp.read(100)
43+
if b"\n" not in buffer:
4344
raise SyntaxError("not an IM file")
44-
self.fp.seek(0)
4545

4646
xsize = ysize = 0
4747

4848
while True:
4949

50-
s = self.fp.read(1)
50+
if buffer:
51+
s = buffer[:1]
52+
buffer = buffer[1:]
53+
else:
54+
s = self.fp.read(1)
5155
if not s:
5256
break
5357

5458
if s == b"\x0C":
5559

5660
# image data begins
5761
self.tile = [
58-
("raw", (0, 0) + self.size, self.fp.tell(), (self.mode, 0, 1))
62+
(
63+
"raw",
64+
(0, 0) + self.size,
65+
self.fp.tell() - len(buffer),
66+
(self.mode, 0, 1),
67+
)
5968
]
6069

6170
break
6271

6372
else:
6473

6574
# read key/value pair
66-
# FIXME: dangerous, may read whole file
67-
s = s + self.fp.readline()
75+
if b"\n" not in buffer:
76+
buffer += self.fp.read(100)
77+
lines = buffer.split(b"\n")
78+
s += lines.pop(0)
79+
buffer = b"\n".join(lines)
6880
if len(s) == 1 or len(s) > 100:
6981
break
7082
if s[0] == ord(b"*"):

0 commit comments

Comments
 (0)