diff --git a/src/copy.c b/src/copy.c index edf022e..f251f32 100644 --- a/src/copy.c +++ b/src/copy.c @@ -431,6 +431,14 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size, ext_len = 0; } + /* Truncate extent to EOF. */ + if (ext_start + ext_len >= src_total_size) + { + if (src_total_size < ext_start) + ext_start = src_total_size; + ext_len = src_total_size - ext_start; + } + ext_hole_size = ext_start - last_ext_start - last_ext_len; wrote_hole_at_eof = false; @@ -493,14 +501,17 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size, off_t n_read; empty_extent = false; last_ext_len = ext_len; + bool read_hole; if ( ! sparse_copy (src_fd, dest_fd, buf, buf_size, sparse_mode == SPARSE_ALWAYS ? hole_size: 0, true, src_name, dst_name, ext_len, &n_read, - &wrote_hole_at_eof)) + &read_hole)) goto fail; dest_pos = ext_start + n_read; + if (n_read) + wrote_hole_at_eof = read_hole; } /* If the file ends with unwritten extents not accounted for in the