[issue44067] Zipfile lib overwrites the extra field during closing when the archive size is more then ZIP64_LIMIT

2021-11-04 Thread anadius


anadius  added the comment:

I was looking at `zipfile._strip_extra` trying to figure out how it works. It 
doesn't. It skips extra headers after the last one that matches. That's what 
causes this issue.

Here's a fixed version:

def _strip_extra(extra, xids):
# Remove Extra Fields with specified IDs.
unpack = _EXTRA_FIELD_STRUCT.unpack
modified = False
buffer = []
start = i = 0
while i + 4 <= len(extra):
xid, xlen = unpack(extra[i : i + 4])
j = i + 4 + xlen
if xid in xids:
if i != start:
buffer.append(extra[start : i])
start = j
modified = True
i = j
if i != start:
buffer.append(extra[start : i])
if not modified:
return extra
return b''.join(buffer)

Or this one, easier to understand:

def _strip_extra(extra, xids):
# Remove Extra Fields with specified IDs.
unpack = _EXTRA_FIELD_STRUCT.unpack
modified = False
buffer = []
i = 0
while i + 4 <= len(extra):
xid, xlen = unpack(extra[i : i + 4])
j = i + 4 + xlen
if xid in xids:
modified = True
else:
buffer.append(extra[i : j])
i = j
if not modified:
return extra
return b''.join(buffer)

Not sure which one is better.

--
nosy: +anadius

___
Python tracker 
<https://bugs.python.org/issue44067>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue44067] Zipfile lib overwrites the extra field during closing when the archive size is more then ZIP64_LIMIT

2021-11-06 Thread anadius


Change by anadius :


--
nosy: +alanmcintyre, serhiy.storchaka, twouters

___
Python tracker 
<https://bugs.python.org/issue44067>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com