@@ -1452,25 +1452,40 @@ def _repack(self, zfile):
14521452        # doesn't match the actual entry order 
14531453        filelist  =  sorted (zfile .filelist , key = lambda  x : x .header_offset )
14541454
1455-         try :
1456-             data_offset  =  filelist [0 ].header_offset 
1457-         except  IndexError :
1458-             data_offset  =  zfile .start_dir 
1459- 
1460-         # calculate the starting entry offset (bytes to skip) 
1461-         entry_offset  =  self ._calc_initial_entry_offset (fp , data_offset )
1462- 
1463-         # move file entries 
1455+         # calculate each entry size and validate 
1456+         entry_size_list  =  []
1457+         used_entry_size_list  =  []
14641458        for  i , zinfo  in  enumerate (filelist ):
1465-             # get the total size of the entry 
14661459            try :
14671460                offset  =  filelist [i  +  1 ].header_offset 
14681461            except  IndexError :
14691462                offset  =  zfile .start_dir 
14701463            entry_size  =  offset  -  zinfo .header_offset 
14711464
1465+             # may raise on an invalid local file header 
14721466            used_entry_size  =  self ._calc_local_file_entry_size (fp , zinfo )
14731467
1468+             self ._debug (3 , i , zinfo .orig_filename , entry_size , used_entry_size )
1469+             if  used_entry_size  >  entry_size :
1470+                 raise  BadZipFile (
1471+                     f"Overlapped entries: { zinfo .orig_filename !r}  
1472+                     f"(possible zip bomb)" )
1473+ 
1474+             entry_size_list .append (entry_size )
1475+             used_entry_size_list .append (used_entry_size )
1476+ 
1477+         # calculate the starting entry offset (bytes to skip) 
1478+         try :
1479+             data_offset  =  filelist [0 ].header_offset 
1480+         except  IndexError :
1481+             data_offset  =  zfile .start_dir 
1482+         entry_offset  =  self ._calc_initial_entry_offset (fp , data_offset )
1483+ 
1484+         # move file entries 
1485+         for  i , zinfo  in  enumerate (filelist ):
1486+             entry_size  =  entry_size_list [i ]
1487+             used_entry_size  =  used_entry_size_list [i ]
1488+ 
14741489            # update the header and move entry data to the new position 
14751490            if  entry_offset  >  0 :
14761491                old_header_offset  =  zinfo .header_offset 
0 commit comments