44
44
45
45
static int add_data (zip_t * , zip_source_t * , zip_dirent_t * , zip_uint32_t );
46
46
static int copy_data (zip_t * , zip_uint64_t );
47
- static int copy_source (zip_t * , zip_source_t * , zip_int64_t );
47
+ static int copy_source (zip_t * , zip_source_t * , zip_source_t * , zip_int64_t );
48
48
static int torrentzip_compare_names (const void * a , const void * b );
49
49
static int write_cdir (zip_t * , const zip_filelist_t * , zip_uint64_t );
50
50
static int write_data_descriptor (zip_t * za , const zip_dirent_t * dirent , int is_zip64 );
@@ -495,7 +495,7 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, zip_uint32_t changed) {
495
495
return -1 ;
496
496
}
497
497
498
- ret = copy_source (za , src_final , data_length );
498
+ ret = copy_source (za , src_final , src , data_length );
499
499
500
500
if (zip_source_stat (src_final , & st ) < 0 ) {
501
501
zip_error_set_from_source (& za -> error , src_final );
@@ -605,7 +605,7 @@ copy_data(zip_t *za, zip_uint64_t len) {
605
605
606
606
607
607
static int
608
- copy_source (zip_t * za , zip_source_t * src , zip_int64_t data_length ) {
608
+ copy_source (zip_t * za , zip_source_t * src , zip_source_t * src_for_length , zip_int64_t data_length ) {
609
609
DEFINE_BYTE_ARRAY (buf , BUFSIZE );
610
610
zip_int64_t n , current ;
611
611
int ret ;
@@ -628,7 +628,13 @@ copy_source(zip_t *za, zip_source_t *src, zip_int64_t data_length) {
628
628
break ;
629
629
}
630
630
if (n == BUFSIZE && za -> progress && data_length > 0 ) {
631
- current += n ;
631
+ zip_int64_t t ;
632
+ t = zip_source_tell (src_for_length );
633
+ if (t >= 0 ) {
634
+ current = t ;
635
+ } else {
636
+ current += n ;
637
+ }
632
638
if (_zip_progress_update (za -> progress , (double )current / (double )data_length ) != 0 ) {
633
639
zip_error_set (& za -> error , ZIP_ER_CANCELLED , 0 );
634
640
ret = -1 ;
0 commit comments