Skip to content
This repository was archived by the owner on Aug 12, 2025. It is now read-only.

Commit f0236ec

Browse files
committed
fix for zip files larger than 4GB
1 parent 760bc74 commit f0236ec

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

pkg2zip_zip.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -286,18 +286,22 @@ void zip_close(zip* z)
286286
// zip64 Extended Information Extra Field
287287
set16le(extra + 0, 1);
288288
// size of this "extra" block
289-
set16le(extra + 2, extra_size - 2*sizeof(uint16_t));
289+
uint32_t extra_offset = 2 * sizeof(uint16_t);
290+
set16le(extra + 2, extra_size - extra_offset);
290291
if (size > 0xffffffff)
291292
{
292293
// original uncompressed file size
293-
set64le(extra + 4, size);
294+
set64le(extra + extra_offset, size);
295+
extra_offset += sizeof(uint64_t);
294296
// size of compressed data
295-
set64le(extra + 12, size);
297+
set64le(extra + extra_offset, size);
298+
extra_offset += sizeof(uint64_t);
296299
}
297300
if (offset > 0xffffffff)
298301
{
299302
// offset of local header record
300-
set64le(extra + 20, offset);
303+
set64le(extra + extra_offset, offset);
304+
extra_offset += sizeof(uint64_t);
301305
}
302306

303307
if (extra_size > 2 * sizeof(uint16_t))
@@ -308,7 +312,7 @@ void zip_close(zip* z)
308312
}
309313

310314
uint64_t end_of_central_dir_offset = z->total;
311-
uint32_t central_dir_size = (uint32_t)(end_of_central_dir_offset - central_dir_offset);
315+
uint64_t central_dir_size = end_of_central_dir_offset - central_dir_offset;
312316

313317
// zip64 end of central directory record
314318
{
@@ -319,10 +323,6 @@ void zip_close(zip* z)
319323
set16le(header + 12, ZIP_VERSION);
320324
// version needed to extract
321325
set16le(header + 14, ZIP_VERSION);
322-
// number of this disk
323-
set32le(header + 16, 0);
324-
// number of the disk with the start of the central directory
325-
set32le(header + 20, 0);
326326
// total number of entries in the central directory on this disk
327327
set64le(header + 24, z->count);
328328
// total number of entries in the central directory
@@ -352,11 +352,11 @@ void zip_close(zip* z)
352352
{
353353
uint8_t header[ZIP_EOC_DIR_SIZE] = { 0x50, 0x4b, 0x05, 0x06 };
354354
// total number of entries in the central directory on this disk
355-
set16le(header + 8, (uint16_t)z->count);
355+
set16le(header + 8, (uint16_t)min32(z->count, 0xffff));
356356
// total number of entries in the central directory
357-
set16le(header + 10, (uint16_t)z->count);
357+
set16le(header + 10, (uint16_t)min32(z->count, 0xffff));
358358
// size of the central directory
359-
set32le(header + 12, central_dir_size);
359+
set32le(header + 12, (uint32_t)min64(central_dir_size, 0xffffffff));
360360
// offset of start of central directory with respect to the starting disk number
361361
set32le(header + 16, (uint32_t)min64(central_dir_offset, 0xffffffff));
362362

0 commit comments

Comments
 (0)