Subject: Re: bug#28054: coreutils 8.27 test failure on x86_64-foxkit-linux-musl

From: Pádraig Brady <[email-masked]>
Date: Sun, 13 Aug 2017 01:07:33 -0700

On 11/08/17 11:49, A. Wilcox wrote:

> FAIL: tests/misc/csplit-io-err
> ==============================
This was due to an inconsistency in the errors output by seq.
A fix for that buglet is attached.

> FAIL: tests/misc/printf-surprise
> ================================
Depending on exit 141 couples the script to the value of SIGPIPE
and to the shell implementation (ksh will return 269 here for e.g.).
So I've attached a solution that should hopefully work in all situations.

> FAIL: tests/misc/sort-debug-warn
> ================================
This was due to an assumption that for "missing" locales
that sort would fail to C rather than C.UTF8.
I've adjusted sort to not assume that in the attached.

thanks,
Pádraig
From 1e1dbbe0f95c7170009f3ba4d8380c1b98ff53c8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <[email-masked]>
Date: Sun, 13 Aug 2017 00:18:43 -0700
Subject: [PATCH] seq: produce consistent error messages upon write error

* src/seq.c (io_error): Use the same error message as would
be generated at exit time when closing the stdout stream.
The inconsistency was added with commit v8.25-26-gc92585b.
This was noticed due to an inconsistency in the expected
error message generated by seq on musl libc.
Reported by A. Wilcox.
---
 src/seq.c               | 2 +-
 tests/misc/seq-epipe.sh | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/seq.c b/src/seq.c
index bb191ba..5e5b381 100644
--- a/src/seq.c
+++ b/src/seq.c
@@ -284,7 +284,7 @@ io_error (void)
 {
   /* FIXME: consider option to silently ignore errno=EPIPE */
   clearerr (stdout);
-  die (EXIT_FAILURE, errno, _("standard output"));
+  die (EXIT_FAILURE, errno, _("write error"));
 }
 
 /* Actually print the sequence of numbers in the specified range, with the
diff --git a/tests/misc/seq-epipe.sh b/tests/misc/seq-epipe.sh
index edbd563..69dd75d 100755
--- a/tests/misc/seq-epipe.sh
+++ b/tests/misc/seq-epipe.sh
@@ -33,7 +33,7 @@ compare exp code || fail=1
 
 # The error message must begin with "standard output:"
 # (but don't hard-code the strerror text)
-grep '^seq: standard output: ' err \
+grep '^seq: write error: ' err \
   || { warn_ "seq emitted incorrect error on EPIPE"; \
        cat err;\
        fail=1; }
-- 
2.9.3

From ad5c14dcadd4603363e68da960ed0101b61439bd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <[email-masked]>
Date: Sat, 12 Aug 2017 23:53:33 -0700
Subject: [PATCH] tests: fix false failure with large printf formats

* tests/misc/printf-surprise.sh: With musl libc the
large printf format does succeed, outputting data.
To avoid SIGPIPE being generated we ignore that signal
and then handle the subsequent EPIPE error.
Reported by A. Wilcox
---
 tests/misc/printf-surprise.sh | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/tests/misc/printf-surprise.sh b/tests/misc/printf-surprise.sh
index 2edd34c..46c0d8f 100755
--- a/tests/misc/printf-surprise.sh
+++ b/tests/misc/printf-surprise.sh
@@ -50,6 +50,9 @@ vm=$(get_min_ulimit_v_ env $prog %20f 0) \
 
 mkfifo_or_skip_ fifo
 
+(trap '' PIPE && yes | :) 2>&1 | grep -qF 'Broken pipe' ||
+    skip_ 'trapping SIGPIPE is not supported'
+
 # Disable MALLOC_PERTURB_, to avoid triggering this bug
 # https://bugs.debian.org/481543#77
 export MALLOC_PERTURB_=0
@@ -60,11 +63,11 @@ cleanup_() { kill $pid 2>/dev/null && wait $pid; }
 head -c 10 fifo > out & pid=$!
 
 # Trigger large mem allocation failure
-( ulimit -v $vm && env $prog %20000000f 0 2>err-msg > fifo )
+( trap '' PIPE && ulimit -v $vm && env $prog %20000000f 0 2>err-msg > fifo )
 exit=$?
 
 # Map this longer, and rarer, diagnostic to the common one.
-# printf: cannot perform formatted output: Cannot allocate memory" \
+# printf: cannot perform formatted output: Cannot allocate memory"
 sed 's/cannot perform .*/write error/' err-msg > k && mv k err-msg
 err_msg=$(tr '\n' : < err-msg)
 
@@ -81,6 +84,7 @@ n_out=$(wc -c < out)
 
 case $n_out:$diagnostic:$exit in
   10:n:0) ;; # ok, succeeds w/no diagnostic: FreeBSD 6.1
+  10:y:1) ;; # ok, fails with EPIPE diagnostic: musl libc
   0:y:1)  ;; # ok, glibc-2.8 and newer, when printf(3) fails with ENOMEM
 
   # With MALLOC_PERTURB_=0, this no longer happens.
-- 
2.9.3

From b938d8966c3d1afec9730d403fd6a6eb4d856b85 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <[email-masked]>
Date: Sun, 13 Aug 2017 00:45:32 -0700
Subject: [PATCH] sort: handle musl locale differences in --debug reporting

* src/sort.c (main): Don't assume hard_LC_COLLATE implies
a successful setting of the locale as musl defaults to
UTF8 when failing to set the specified locale.
* tests/misc/sort-debug-warn.sh: Adjust for the now
separated locale debug info and map the musl specific
message back to the common case.
Reported by A. Wilcox.
---
 src/sort.c                    | 17 +++++++++--------
 tests/misc/sort-debug-warn.sh |  9 +++++++--
 2 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/src/sort.c b/src/sort.c
index 015e40e..ba6ceac 100644
--- a/src/sort.c
+++ b/src/sort.c
@@ -4675,18 +4675,19 @@ main (int argc, char **argv)
 
       /* Always output the locale in debug mode, since this
          is such a common source of confusion.  */
+
+      /* OpenBSD can only set some categories with LC_ALL above,
+         so set LC_COLLATE explicitly to flag errors.  */
+      if (locale_ok)
+        locale_ok = !! setlocale (LC_COLLATE, "");
+      if (! locale_ok)
+          error (0, 0, "%s", _("failed to set locale"));
       if (hard_LC_COLLATE)
         error (0, 0, _("using %s sorting rules"),
                quote (setlocale (LC_COLLATE, NULL)));
       else
-        {
-          /* OpenBSD can only set some categories with LC_ALL above,
-             so set LC_COLLATE explicitly to flag errors.  */
-          if (locale_ok)
-            locale_ok = !! setlocale (LC_COLLATE, "");
-          error (0, 0, "%s%s", locale_ok ? "" : _("failed to set locale; "),
-                 _("using simple byte comparison"));
-        }
+        error (0, 0, "%s", _("using simple byte comparison"));
+
       key_warnings (&gkey, gkey_only);
     }
 
diff --git a/tests/misc/sort-debug-warn.sh b/tests/misc/sort-debug-warn.sh
index 3602c84..8119693 100755
--- a/tests/misc/sort-debug-warn.sh
+++ b/tests/misc/sort-debug-warn.sh
@@ -71,7 +71,8 @@ sort: using simple byte comparison
 17
 sort: using simple byte comparison
 18
-sort: failed to set locale; using simple byte comparison
+sort: failed to set locale
+sort: using simple byte comparison
 EOF
 
 echo 1 >> out
@@ -109,7 +110,11 @@ sort -rM --debug /dev/null 2>>out #no warning
 echo 17 >> out
 sort -rM -k1,1 --debug /dev/null 2>>out #no warning
 echo 18 >> out
-LC_ALL=missing sort --debug /dev/null 2>>out
+LC_ALL=missing sort --debug /dev/null 2>>out.t
+# musl libc accepts "missing" and implicitly uses UTF8,
+# so adjust the expected message accordingly.
+sed 's/using .*missing.* sorting rules/using simple byte comparison/' \
+  out.t >>out
 
 compare exp out || fail=1
 
-- 
2.9.3