]> git.ipfire.org Git - thirdparty/rsync.git/commitdiff
Fix issue with trailing --sparse --inplace blocks.
authorWayne Davison <wayne@opencoder.net>
Sat, 29 Apr 2023 14:45:52 +0000 (07:45 -0700)
committerWayne Davison <wayne@opencoder.net>
Sat, 29 Apr 2023 14:56:27 +0000 (07:56 -0700)
Fixes #450.

fileio.c
receiver.c

index f80af19e4e5ea8eca91d932ea185d6faa6fb7ef1..3be5bd15eb601313ae72e5276d57b2fa44a63078 100644 (file)
--- a/fileio.c
+++ b/fileio.c
@@ -40,30 +40,34 @@ OFF_T preallocated_len = 0;
 static OFF_T sparse_seek = 0;
 static OFF_T sparse_past_write = 0;
 
-int sparse_end(int f, OFF_T size)
+int sparse_end(int f, OFF_T size, int updating_basis_or_equiv)
 {
-       int ret;
-
-       sparse_past_write = 0;
-
-       if (!sparse_seek)
-               return 0;
+       int ret = 0;
 
+       if (updating_basis_or_equiv) {
+               if (sparse_seek && do_punch_hole(f, sparse_past_write, sparse_seek) < 0)
+                       ret = -1;
+#ifdef HAVE_FTRUNCATE /* A compilation formality -- in-place requires ftruncate() */
+               else /* Just in case the original file was longer */
+                       ret = do_ftruncate(f, size);
+#endif
+       } else if (sparse_seek) {
 #ifdef HAVE_FTRUNCATE
-       ret = do_ftruncate(f, size);
+               ret = do_ftruncate(f, size);
 #else
-       if (do_lseek(f, sparse_seek-1, SEEK_CUR) != size-1)
-               ret = -1;
-       else {
-               do {
-                       ret = write(f, "", 1);
-               } while (ret < 0 && errno == EINTR);
-
-               ret = ret <= 0 ? -1 : 0;
-       }
+               if (do_lseek(f, sparse_seek-1, SEEK_CUR) != size-1)
+                       ret = -1;
+               else {
+                       do {
+                               ret = write(f, "", 1);
+                       } while (ret < 0 && errno == EINTR);
+
+                       ret = ret <= 0 ? -1 : 0;
+               }
 #endif
+       }
 
-       sparse_seek = 0;
+       sparse_past_write = sparse_seek = 0;
 
        return ret;
 }
index c9d7e01d7fe01f90ca6eeff58a1f511397b675f8..3061eeb49a2e8a2d4f7d63d162ff8a9528b9aed4 100644 (file)
@@ -372,7 +372,7 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
 
        if (fd != -1 && offset > 0) {
                if (sparse_files > 0) {
-                       if (sparse_end(fd, offset) != 0)
+                       if (sparse_end(fd, offset, updating_basis_or_equiv) != 0)
                                goto report_write_error;
                } else if (flush_write_file(fd) < 0) {
                    report_write_error: