Package: coreutils
Version: 8.32-3
Severity: serious
Tags: patch ftbfs

Hi,

The current coreutils version FTBFS on arm64:

src/ls.c: In function 'print_dir':
src/ls.c:3026:24: error: 'SYS_getdents' undeclared (first use in this 
function); did you mean 'SYS_getdents64'?
 3026 |           if (syscall (SYS_getdents, dirfd (dirp), NULL, 0) == -1
      |                        ^~~~~~~~~~~~
      |                        SYS_getdents64
src/ls.c:3026:24: note: each undeclared identifier is reported only once for 
each function it appears in

This has been reported upstream in
<https://lists.gnu.org/archive/html/bug-coreutils/2020-03/msg00005.html>.
The fix upstream adopted is to restore the behaviour of ls on removed
directories back to what it was on 8.31.

I've backported the patches needed to fix the issue, so I'm proposing
them here.  Ubuntu coreutils is already carrying these patches and the
ARM64 build passes there.

Thanks!

-- 
Sergio
GPG key ID: 237A 54B1 0287 28BF 00EF  31F4 D0EB 7628 65FC 5E36
Please send encrypted e-mail if possible
https://sergiodj.net/

diff -Nru coreutils-8.32/debian/changelog coreutils-8.32/debian/changelog
--- coreutils-8.32/debian/changelog	2020-07-20 14:09:06.000000000 -0400
+++ coreutils-8.32/debian/changelog	2020-07-28 10:50:52.000000000 -0400
@@ -1,3 +1,16 @@
+coreutils (8.32-3.1) unstable; urgency=medium
+
+  * Non-maintainer upload.
+  * Fix FTBFS on ARM64.
+    - d/p/restore-ls-behavior-8.31.patch: Upstream patch to restore
+      coreutils ls' 8.31 behavior on removed directories, which is
+      necessary to prevent using SYS_getdents that doesn't exist on
+      ARM64.
+    - d/p/improve-removed-directory-test.patch: Upstream patch to
+      improve ls' removed-directory test.
+
+ -- Sergio Durigan Junior <sergi...@debian.org>  Tue, 28 Jul 2020 10:50:52 -0400
+
 coreutils (8.32-3) unstable; urgency=low
 
   * build with libgmp now that apt pulls it in anyway (Closes: #64527)
diff -Nru coreutils-8.32/debian/patches/improve-removed-directory-test.patch coreutils-8.32/debian/patches/improve-removed-directory-test.patch
--- coreutils-8.32/debian/patches/improve-removed-directory-test.patch	1969-12-31 19:00:00.000000000 -0500
+++ coreutils-8.32/debian/patches/improve-removed-directory-test.patch	2020-07-28 10:50:23.000000000 -0400
@@ -0,0 +1,49 @@
+From: Paul Eggert <egg...@cs.ucla.edu>
+Date: Sat, 7 Mar 2020 10:29:51 -0800
+Subject: ls: improve removed-directory test
+
+* tests/ls/removed-directory.sh: Remove host_triplet test.
+Skip this test if one cannot remove the working directory.
+From a suggestion by Bernhard Voelker (Bug#39929).
+
+Author: Paul Eggert <egg...@cs.ucla.edu>
+Origin: upstream, https://git.savannah.gnu.org/cgit/coreutils.git/commit/?id=672819c73f2e94e61386dc0584bddf9da860cc26
+Bug: https://lists.gnu.org/archive/html/bug-coreutils/2020-03/msg00005.html
+Last-Updated: 2020-07-24
+Reviewed-By: Sergio Durigan Junior <sergio.duri...@canonical.com>
+---
+ tests/ls/removed-directory.sh | 13 ++++---------
+ 1 file changed, 4 insertions(+), 9 deletions(-)
+
+diff --git a/tests/ls/removed-directory.sh b/tests/ls/removed-directory.sh
+index fe8f929..63b209d 100755
+--- a/tests/ls/removed-directory.sh
++++ b/tests/ls/removed-directory.sh
+@@ -1,7 +1,7 @@
+ #!/bin/sh
+-# If ls is asked to list a removed directory (e.g. the parent process's
+-# current working directory that has been removed by another process), it
+-# emits an error message.
++# If ls is asked to list a removed directory (e.g., the parent process's
++# current working directory has been removed by another process), it
++# should not emit an error message merely because the directory is removed.
+ 
+ # Copyright (C) 2020 Free Software Foundation, Inc.
+ 
+@@ -21,15 +21,10 @@
+ . "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
+ print_ver_ ls
+ 
+-case $host_triplet in
+-  *linux*) ;;
+-  *) skip_ 'non linux kernel' ;;
+-esac
+-
+ cwd=$(pwd)
+ mkdir d || framework_failure_
+ cd d || framework_failure_
+-rmdir ../d || framework_failure_
++rmdir ../d || skip_ "can't remove working directory on this platform"
+ 
+ ls >../out 2>../err || fail=1
+ cd "$cwd" || framework_failure_
diff -Nru coreutils-8.32/debian/patches/restore-ls-behavior-8.31.patch coreutils-8.32/debian/patches/restore-ls-behavior-8.31.patch
--- coreutils-8.32/debian/patches/restore-ls-behavior-8.31.patch	1969-12-31 19:00:00.000000000 -0500
+++ coreutils-8.32/debian/patches/restore-ls-behavior-8.31.patch	2020-07-28 10:50:23.000000000 -0400
@@ -0,0 +1,126 @@
+From: Paul Eggert <egg...@cs.ucla.edu>
+Date: Thu, 5 Mar 2020 17:25:29 -0800
+Subject: ls: restore 8.31 behavior on removed directories
+
+* NEWS: Mention this.
+* src/ls.c: Do not include <sys/sycall.h>
+(print_dir): Don't worry about whether the directory is removed.
+* tests/ls/removed-directory.sh: Adjust to match new (i.e., old)
+behavior.
+
+This patch is needed because coreutils 8.32 fails to build on ARM64
+with:
+
+src/ls.c: In function 'print_dir':
+src/ls.c:3026:24: error: 'SYS_getdents' undeclared (first use in this function); did you mean 'SYS_getdents64'?
+ 3026 |           if (syscall (SYS_getdents, dirfd (dirp), NULL, 0) == -1
+      |                        ^~~~~~~~~~~~
+      |                        SYS_getdents64
+
+Author: Paul Eggert <egg...@cs.ucla.edu>
+Origin: upstream, https://git.savannah.gnu.org/cgit/coreutils.git/commit/?id=10fcb97bd728f09d4a027eddf8ad2900f0819b0a
+Bug: https://lists.gnu.org/archive/html/bug-coreutils/2020-03/msg00005.html
+Last-Updated: 2020-07-24
+Reviewed-By: Sergio Durigan Junior <sergio.duri...@canonical.com>
+---
+ NEWS                          |  4 ----
+ src/ls.c                      | 22 ----------------------
+ tests/ls/removed-directory.sh | 10 ++--------
+ 3 files changed, 2 insertions(+), 34 deletions(-)
+
+diff --git a/NEWS b/NEWS
+index 3e44c0c..3b419cb 100644
+--- a/NEWS
++++ b/NEWS
+@@ -65,10 +65,6 @@ GNU coreutils NEWS                                    -*- outline -*-
+   [The old behavior was introduced in sh-utils 2.0.15 ca. 1999, predating
+   coreutils package.]
+ 
+-  ls issues an error message on a removed directory, on GNU/Linux systems.
+-  Previously no error and no entries were output, and so indistinguishable
+-  from an empty directory, with default ls options.
+-
+   uniq no longer uses strcoll() to determine string equivalence,
+   and so will operate more efficiently and consistently.
+ 
+diff --git a/src/ls.c b/src/ls.c
+index 24b9832..4acf5f4 100644
+--- a/src/ls.c
++++ b/src/ls.c
+@@ -49,10 +49,6 @@
+ # include <sys/ptem.h>
+ #endif
+ 
+-#ifdef __linux__
+-# include <sys/syscall.h>
+-#endif
+-
+ #include <stdio.h>
+ #include <assert.h>
+ #include <setjmp.h>
+@@ -2896,7 +2892,6 @@ print_dir (char const *name, char const *realname, bool command_line_arg)
+   struct dirent *next;
+   uintmax_t total_blocks = 0;
+   static bool first = true;
+-  bool found_any_entries = false;
+ 
+   errno = 0;
+   dirp = opendir (name);
+@@ -2972,7 +2967,6 @@ print_dir (char const *name, char const *realname, bool command_line_arg)
+       next = readdir (dirp);
+       if (next)
+         {
+-          found_any_entries = true;
+           if (! file_ignored (next->d_name))
+             {
+               enum filetype type = unknown;
+@@ -3018,22 +3012,6 @@ print_dir (char const *name, char const *realname, bool command_line_arg)
+           if (errno != EOVERFLOW)
+             break;
+         }
+-#ifdef __linux__
+-      else if (! found_any_entries)
+-        {
+-          /* If readdir finds no directory entries at all, not even "." or
+-             "..", then double check that the directory exists.  */
+-          if (syscall (SYS_getdents, dirfd (dirp), NULL, 0) == -1
+-              && errno != EINVAL)
+-            {
+-              /* We exclude EINVAL as that pertains to buffer handling,
+-                 and we've passed NULL as the buffer for simplicity.
+-                 ENOENT is returned if appropriate before buffer handling.  */
+-              file_failure (command_line_arg, _("reading directory %s"), name);
+-            }
+-          break;
+-        }
+-#endif
+       else
+         break;
+ 
+diff --git a/tests/ls/removed-directory.sh b/tests/ls/removed-directory.sh
+index e8c835d..fe8f929 100755
+--- a/tests/ls/removed-directory.sh
++++ b/tests/ls/removed-directory.sh
+@@ -26,20 +26,14 @@ case $host_triplet in
+   *) skip_ 'non linux kernel' ;;
+ esac
+ 
+-LS_FAILURE=2
+-
+-cat <<\EOF >exp-err || framework_failure_
+-ls: reading directory '.': No such file or directory
+-EOF
+-
+ cwd=$(pwd)
+ mkdir d || framework_failure_
+ cd d || framework_failure_
+ rmdir ../d || framework_failure_
+ 
+-returns_ $LS_FAILURE ls >../out 2>../err || fail=1
++ls >../out 2>../err || fail=1
+ cd "$cwd" || framework_failure_
+ compare /dev/null out || fail=1
+-compare exp-err err || fail=1
++compare /dev/null err || fail=1
+ 
+ Exit $fail
diff -Nru coreutils-8.32/debian/patches/series coreutils-8.32/debian/patches/series
--- coreutils-8.32/debian/patches/series	2020-06-22 14:41:01.000000000 -0400
+++ coreutils-8.32/debian/patches/series	2020-07-28 10:50:29.000000000 -0400
@@ -3,3 +3,5 @@
 72_id_checkngroups.patch
 85_timer_settime.patch
 99_kfbsd_fstat_patch.patch
+restore-ls-behavior-8.31.patch
+improve-removed-directory-test.patch

Attachment: signature.asc
Description: PGP signature

Reply via email to