@@ -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