Commit
v9.8-95-g4c0cf3864 intended to initialize
ext_start to src_pos, as was described at:
https://lists.gnu.org/r/coreutils/2025-11/msg00035.html
However ipos was inadvertently used, which is only
valid the first time through the loop.
* src/copy-file-data.c (lseek_copy): Use scan_inference->hole_start
only with the initial offset passed to lseek_copy().
* NEWS: Mention the bug fix.
Reported at https://github.com/coreutils/coreutils/issues/159
** Bug fixes
+ cp, install, and mv no longer enter an infinite loop copying sparse files
+ with SEEK_HOLE. E.g., this was seen on ext4 when copying sparse files with
+ extents that are being actively updated, and copy offload is not being used.
+ [bug introduced in coreutils-9.9]
+
'date' no longer fails with format directives that return an empty string.
[bug introduced in coreutils-9.9]
for (off_t ext_start = scan_inference->ext_start;
0 <= ext_start && ext_start < max_ipos; )
{
- off_t ext_end = (ext_start == ipos
+ off_t ext_end = (ext_start == src_pos
? scan_inference->hole_start
: lseek (src_fd, ext_start, SEEK_HOLE));
if (0 <= ext_end)