coreutils: patch possible infinite loop with SEEK_HOLE
authorWei-Ting Yang <williamatcg@gmail.com>
Fri, 9 Jan 2026 12:14:24 +0000 (20:14 +0800)
committerHannu Nyman <hannu.nyman@iki.fi>
Sun, 18 Jan 2026 05:19:37 +0000 (07:19 +0200)
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.

See also:
https://github.com/coreutils/coreutils/commit/bd528f923482223649aa84be7d131e69356149da

Signed-off-by: Wei-Ting Yang <williamatcg@gmail.com>
utils/coreutils/Makefile
utils/coreutils/patches/000-copy-fix-possible-infinite-loop-with-SEEK_HOLE.patch [new file with mode: 0644]
utils/coreutils/patches/001-no_docs_man_tests.patch [deleted file]
utils/coreutils/patches/900-no_docs_man_tests.patch [new file with mode: 0644]

index b5f26fc9426b4d5b4a54ef6e517f945b4d732f4b..08c8d0b5a728ee556ca4831d33abbc1cab180279 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=coreutils
 PKG_VERSION:=9.9
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=@GNU/coreutils
diff --git a/utils/coreutils/patches/000-copy-fix-possible-infinite-loop-with-SEEK_HOLE.patch b/utils/coreutils/patches/000-copy-fix-possible-infinite-loop-with-SEEK_HOLE.patch
new file mode 100644 (file)
index 0000000..3406fe5
--- /dev/null
@@ -0,0 +1,26 @@
+From bd528f923482223649aa84be7d131e69356149da Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
+Date: Sun, 4 Jan 2026 12:45:46 +0000
+Subject: [PATCH] copy: fix possible infinite loop with SEEK_HOLE
+
+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().
+Reported at https://github.com/coreutils/coreutils/issues/159
+
+--- a/src/copy-file-data.c
++++ b/src/copy-file-data.c
+@@ -338,7 +338,7 @@ lseek_copy (int src_fd, int dest_fd, cha
+   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)
diff --git a/utils/coreutils/patches/001-no_docs_man_tests.patch b/utils/coreutils/patches/001-no_docs_man_tests.patch
deleted file mode 100644 (file)
index e0029d1..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -17,7 +17,7 @@
- ALL_RECURSIVE_TARGETS =
--SUBDIRS = po . gnulib-tests
-+SUBDIRS = po
- EXTRA_DIST =                          \
-   .mailmap                            \
-@@ -209,6 +209,3 @@ AM_CPPFLAGS = -Ilib -I$(top_srcdir)/lib
- include $(top_srcdir)/gl/local.mk
- include $(top_srcdir)/lib/local.mk
- include $(top_srcdir)/src/local.mk
--include $(top_srcdir)/doc/local.mk
--include $(top_srcdir)/man/local.mk
--include $(top_srcdir)/tests/local.mk
---- a/Makefile.in
-+++ b/Makefile.in
-@@ -4701,11 +4701,7 @@ RECURSIVE_TARGETS = all-recursive check-
-       install-ps-recursive install-recursive installcheck-recursive \
-       installdirs-recursive pdf-recursive ps-recursive \
-       tags-recursive uninstall-recursive
--am__can_run_installinfo = \
--  case $$AM_UPDATE_INFO_DIR in \
--    n|no|NO) false;; \
--    *) (install-info --version) >/dev/null 2>&1;; \
--  esac
-+am__can_run_installinfo = false
- am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
- am__vpath_adj = case $$p in \
-     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-@@ -4960,11 +4956,10 @@ am__DIST_COMMON = $(doc_coreutils_TEXINF
-       $(top_srcdir)/build-aux/missing \
-       $(top_srcdir)/build-aux/test-driver \
-       $(top_srcdir)/build-aux/texinfo.tex \
--      $(top_srcdir)/build-aux/ylwrap $(top_srcdir)/doc/local.mk \
-+      $(top_srcdir)/build-aux/ylwrap \
-       $(top_srcdir)/gl/local.mk $(top_srcdir)/lib/alloca.c \
--      $(top_srcdir)/lib/config.hin $(top_srcdir)/lib/local.mk \
--      $(top_srcdir)/man/local.mk $(top_srcdir)/src/local.mk \
--      $(top_srcdir)/src/single-binary.mk \
-+      $(top_srcdir)/lib/local.mk \
-+      $(top_srcdir)/src/local.mk \
-       $(top_srcdir)/tests/local.mk ABOUT-NLS AUTHORS COPYING \
-       ChangeLog INSTALL NEWS README THANKS TODO build-aux/compile \
-       build-aux/config.guess build-aux/config.rpath \
-@@ -5085,7 +5080,7 @@ ERRNO_H = @ERRNO_H@
- ETAGS = @ETAGS@
- EUIDACCESS_LIBGEN = @EUIDACCESS_LIBGEN@
- EXEEXT = @EXEEXT@
--EXTRA_MANS = @EXTRA_MANS@
-+EXTRA_MANS =
- FDATASYNC_LIB = @FDATASYNC_LIB@
- FILE_HAS_ACL_LIB = @FILE_HAS_ACL_LIB@
- FLOAT_H = @FLOAT_H@
-@@ -7185,7 +7180,7 @@ localedir_c_make = @localedir_c_make@
- localstatedir = @localstatedir@
- localstatedir_c = @localstatedir_c@
- localstatedir_c_make = @localstatedir_c_make@
--man1_MANS = @man1_MANS@
-+man1_MANS =
- mandir = @mandir@
- mandir_c = @mandir_c@
- mandir_c_make = @mandir_c_make@
-@@ -7234,7 +7229,7 @@ top_build_prefix = @top_build_prefix@
- top_builddir = @top_builddir@
- top_srcdir = @top_srcdir@
- ALL_RECURSIVE_TARGETS = distcheck-hook check-root
--SUBDIRS = po . gnulib-tests
-+SUBDIRS = po
- EXTRA_DIST = .mailmap .prev-version .version .vg-suppressions \
-       README-install THANKS.in THANKS-to-translators THANKStt.in \
-       bootstrap bootstrap.conf build-aux/gen-lists-of-programs.sh \
-@@ -9633,7 +9628,7 @@ all: $(BUILT_SOURCES)
- .SUFFIXES: .1 .c .dvi .log .o .obj .pl .pl$(EXEEXT) .ps .sh .sh$(EXEEXT) .trs .x .xpl .xpl$(EXEEXT) .y
- am--refresh: Makefile
-       @:
--$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/gl/local.mk $(top_srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(top_srcdir)/src/local.mk $(srcdir)/src/cu-progs.mk $(top_srcdir)/src/single-binary.mk $(top_srcdir)/doc/local.mk $(top_srcdir)/man/local.mk $(top_srcdir)/tests/local.mk $(am__configure_deps)
-+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/gl/local.mk $(top_srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(top_srcdir)/src/local.mk $(srcdir)/src/cu-progs.mk $(top_srcdir)/src/single-binary.mk $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-@@ -9655,7 +9650,7 @@ Makefile: $(srcdir)/Makefile.in $(top_bu
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
-       esac;
--$(top_srcdir)/gl/local.mk $(top_srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(top_srcdir)/src/local.mk $(srcdir)/src/cu-progs.mk $(top_srcdir)/src/single-binary.mk $(top_srcdir)/doc/local.mk $(top_srcdir)/man/local.mk $(top_srcdir)/tests/local.mk $(am__empty):
-+$(top_srcdir)/gl/local.mk $(top_srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(top_srcdir)/src/local.mk $(srcdir)/src/cu-progs.mk $(top_srcdir)/src/single-binary.mk $(am__empty):
- $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       $(SHELL) ./config.status --recheck
diff --git a/utils/coreutils/patches/900-no_docs_man_tests.patch b/utils/coreutils/patches/900-no_docs_man_tests.patch
new file mode 100644 (file)
index 0000000..e0029d1
--- /dev/null
@@ -0,0 +1,93 @@
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -17,7 +17,7 @@
+ ALL_RECURSIVE_TARGETS =
+-SUBDIRS = po . gnulib-tests
++SUBDIRS = po
+ EXTRA_DIST =                          \
+   .mailmap                            \
+@@ -209,6 +209,3 @@ AM_CPPFLAGS = -Ilib -I$(top_srcdir)/lib
+ include $(top_srcdir)/gl/local.mk
+ include $(top_srcdir)/lib/local.mk
+ include $(top_srcdir)/src/local.mk
+-include $(top_srcdir)/doc/local.mk
+-include $(top_srcdir)/man/local.mk
+-include $(top_srcdir)/tests/local.mk
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -4701,11 +4701,7 @@ RECURSIVE_TARGETS = all-recursive check-
+       install-ps-recursive install-recursive installcheck-recursive \
+       installdirs-recursive pdf-recursive ps-recursive \
+       tags-recursive uninstall-recursive
+-am__can_run_installinfo = \
+-  case $$AM_UPDATE_INFO_DIR in \
+-    n|no|NO) false;; \
+-    *) (install-info --version) >/dev/null 2>&1;; \
+-  esac
++am__can_run_installinfo = false
+ am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+ am__vpath_adj = case $$p in \
+     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+@@ -4960,11 +4956,10 @@ am__DIST_COMMON = $(doc_coreutils_TEXINF
+       $(top_srcdir)/build-aux/missing \
+       $(top_srcdir)/build-aux/test-driver \
+       $(top_srcdir)/build-aux/texinfo.tex \
+-      $(top_srcdir)/build-aux/ylwrap $(top_srcdir)/doc/local.mk \
++      $(top_srcdir)/build-aux/ylwrap \
+       $(top_srcdir)/gl/local.mk $(top_srcdir)/lib/alloca.c \
+-      $(top_srcdir)/lib/config.hin $(top_srcdir)/lib/local.mk \
+-      $(top_srcdir)/man/local.mk $(top_srcdir)/src/local.mk \
+-      $(top_srcdir)/src/single-binary.mk \
++      $(top_srcdir)/lib/local.mk \
++      $(top_srcdir)/src/local.mk \
+       $(top_srcdir)/tests/local.mk ABOUT-NLS AUTHORS COPYING \
+       ChangeLog INSTALL NEWS README THANKS TODO build-aux/compile \
+       build-aux/config.guess build-aux/config.rpath \
+@@ -5085,7 +5080,7 @@ ERRNO_H = @ERRNO_H@
+ ETAGS = @ETAGS@
+ EUIDACCESS_LIBGEN = @EUIDACCESS_LIBGEN@
+ EXEEXT = @EXEEXT@
+-EXTRA_MANS = @EXTRA_MANS@
++EXTRA_MANS =
+ FDATASYNC_LIB = @FDATASYNC_LIB@
+ FILE_HAS_ACL_LIB = @FILE_HAS_ACL_LIB@
+ FLOAT_H = @FLOAT_H@
+@@ -7185,7 +7180,7 @@ localedir_c_make = @localedir_c_make@
+ localstatedir = @localstatedir@
+ localstatedir_c = @localstatedir_c@
+ localstatedir_c_make = @localstatedir_c_make@
+-man1_MANS = @man1_MANS@
++man1_MANS =
+ mandir = @mandir@
+ mandir_c = @mandir_c@
+ mandir_c_make = @mandir_c_make@
+@@ -7234,7 +7229,7 @@ top_build_prefix = @top_build_prefix@
+ top_builddir = @top_builddir@
+ top_srcdir = @top_srcdir@
+ ALL_RECURSIVE_TARGETS = distcheck-hook check-root
+-SUBDIRS = po . gnulib-tests
++SUBDIRS = po
+ EXTRA_DIST = .mailmap .prev-version .version .vg-suppressions \
+       README-install THANKS.in THANKS-to-translators THANKStt.in \
+       bootstrap bootstrap.conf build-aux/gen-lists-of-programs.sh \
+@@ -9633,7 +9628,7 @@ all: $(BUILT_SOURCES)
+ .SUFFIXES: .1 .c .dvi .log .o .obj .pl .pl$(EXEEXT) .ps .sh .sh$(EXEEXT) .trs .x .xpl .xpl$(EXEEXT) .y
+ am--refresh: Makefile
+       @:
+-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/gl/local.mk $(top_srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(top_srcdir)/src/local.mk $(srcdir)/src/cu-progs.mk $(top_srcdir)/src/single-binary.mk $(top_srcdir)/doc/local.mk $(top_srcdir)/man/local.mk $(top_srcdir)/tests/local.mk $(am__configure_deps)
++$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/gl/local.mk $(top_srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(top_srcdir)/src/local.mk $(srcdir)/src/cu-progs.mk $(top_srcdir)/src/single-binary.mk $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+@@ -9655,7 +9650,7 @@ Makefile: $(srcdir)/Makefile.in $(top_bu
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
+       esac;
+-$(top_srcdir)/gl/local.mk $(top_srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(top_srcdir)/src/local.mk $(srcdir)/src/cu-progs.mk $(top_srcdir)/src/single-binary.mk $(top_srcdir)/doc/local.mk $(top_srcdir)/man/local.mk $(top_srcdir)/tests/local.mk $(am__empty):
++$(top_srcdir)/gl/local.mk $(top_srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(top_srcdir)/src/local.mk $(srcdir)/src/cu-progs.mk $(top_srcdir)/src/single-binary.mk $(am__empty):
+ $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       $(SHELL) ./config.status --recheck