Skip to content

Commit fef92c4

Browse files
committed
Fix and optimize _iter_scan_signature
1 parent ea3259f commit fef92c4

File tree

1 file changed

+8
-9
lines changed

1 file changed

+8
-9
lines changed

Lib/zipfile/__init__.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1573,25 +1573,24 @@ def _iter_scan_signature(self, fp, signature, start_offset, end_offset, chunk_si
15731573
remainder = b''
15741574
pos = start_offset
15751575

1576-
fp.seek(start_offset)
15771576
while pos < end_offset:
1578-
read_size = min(chunk_size, end_offset - pos)
1579-
chunk = remainder + fp.read(read_size)
1580-
if not chunk:
1581-
break
1577+
# required for each loop since fp may be changed during each yield
1578+
fp.seek(pos)
1579+
1580+
chunk = remainder + fp.read(min(chunk_size, end_offset - pos))
15821581

1582+
delta = pos - len(remainder)
15831583
idx = 0
15841584
while True:
15851585
idx = chunk.find(signature, idx)
1586-
if idx == -1 or idx + sig_len > len(chunk):
1586+
if idx == -1:
15871587
break
15881588

1589-
abs_pos = pos - len(remainder) + idx
1590-
yield abs_pos
1589+
yield delta + idx
15911590
idx += 1
15921591

15931592
remainder = chunk[-(sig_len - 1):]
1594-
pos += read_size
1593+
pos += chunk_size
15951594

15961595
def _validate_local_file_entry_sequence(self, fp, start_offset, end_offset, checked_offsets=None):
15971596
offset = start_offset

0 commit comments

Comments
 (0)