Browse Source

coreutils package update

Signed-off-by: basebuilder_pel7x64builder0 <basebuilder@powerel.org>
master
basebuilder_pel7x64builder0 6 years ago
parent
commit
148da4c76a
  1. 18
      SOURCES/coreutils-4.5.3-langinfo.patch
  2. 157
      SOURCES/coreutils-6.10-configuration.patch
  3. 13
      SOURCES/coreutils-6.10-manpages.patch
  4. 12
      SOURCES/coreutils-7.4-sttytcsadrain.patch
  5. 49
      SOURCES/coreutils-8.2-uname-processortype.patch
  6. 109
      SOURCES/coreutils-8.22-cp-selinux.patch
  7. 279
      SOURCES/coreutils-8.22-cp-sparsecorrupt.patch
  8. 46
      SOURCES/coreutils-8.22-date-emptyTZ.patch
  9. 479
      SOURCES/coreutils-8.22-dd-progress.patch
  10. 40
      SOURCES/coreutils-8.22-df-autofs.patch
  11. 513
      SOURCES/coreutils-8.22-df-filtermountlistupdate.patch
  12. 117
      SOURCES/coreutils-8.22-df-getdisk.patch
  13. 72
      SOURCES/coreutils-8.22-df-stat.patch
  14. 157
      SOURCES/coreutils-8.22-du-bindmountcycles.patch
  15. 32
      SOURCES/coreutils-8.22-failingtests.patch
  16. 39
      SOURCES/coreutils-8.22-id-groups.patch
  17. 236
      SOURCES/coreutils-8.22-ls-interruption.patch
  18. 365
      SOURCES/coreutils-8.22-mv-hardlinksrace.patch
  19. 1017
      SOURCES/coreutils-8.22-mv-n-noreplace.patch
  20. 171
      SOURCES/coreutils-8.22-newfilesystems.patch
  21. 267
      SOURCES/coreutils-8.22-non-defaulttests.patch
  22. 39
      SOURCES/coreutils-8.22-ppc64le.patch
  23. 80
      SOURCES/coreutils-8.22-selinux-optionsseparate.patch
  24. 35
      SOURCES/coreutils-8.22-sort-blanks.patch
  25. 13
      SOURCES/coreutils-8.22-temporarytestoff.patch
  26. 12
      SOURCES/coreutils-8.22-vxfs-noinotify.patch
  27. 29
      SOURCES/coreutils-8.22-xfs-tests.patch
  28. 93
      SOURCES/coreutils-8.22-xfsbuildfailure.patch
  29. 12
      SOURCES/coreutils-8.4-mkdir-modenote.patch
  30. 263
      SOURCES/coreutils-DIR_COLORS
  31. 233
      SOURCES/coreutils-DIR_COLORS.256color
  32. 236
      SOURCES/coreutils-DIR_COLORS.lightbgcolor
  33. 68
      SOURCES/coreutils-colorls.csh
  34. 57
      SOURCES/coreutils-colorls.sh
  35. 170
      SOURCES/coreutils-df-direct.patch
  36. 86
      SOURCES/coreutils-getgrouplist.patch
  37. 83
      SOURCES/coreutils-i18n-fold-newline.patch
  38. 103
      SOURCES/coreutils-i18n-sort-memleak.patch
  39. 4751
      SOURCES/coreutils-i18n.patch
  40. 11
      SOURCES/coreutils-overflow.patch
  41. 529
      SOURCES/coreutils-selinux.patch
  42. 53
      SOURCES/coreutils-selinuxmanpages.patch
  43. 12
      SOURCES/sh-utils-2.0.11-dateman.patch
  44. 2095
      SPECS/coreutils.spec

18
SOURCES/coreutils-4.5.3-langinfo.patch

@ -0,0 +1,18 @@
--- coreutils-5.92/src/date.c.langinfo 2005-09-16 09:06:57.000000000 +0100
+++ coreutils-5.92/src/date.c 2005-10-24 18:09:16.000000000 +0100
@@ -451,14 +451,7 @@
format = DATE_FMT_LANGINFO ();
if (! *format)
{
- /* Do not wrap the following literal format string with _(...).
- For example, suppose LC_ALL is unset, LC_TIME=POSIX,
- and LANG="ko_KR". In that case, POSIX says that LC_TIME
- determines the format and contents of date and time strings
- written by date, which means "date" must generate output
- using the POSIX locale; but adding _() would cause "date"
- to use a Korean translation of the format. */
- format = "%a %b %e %H:%M:%S %Z %Y";
+ format = dcgettext(NULL, N_("%a %b %e %H:%M:%S %Z %Y"), LC_TIME);
}
}

157
SOURCES/coreutils-6.10-configuration.patch

@ -0,0 +1,157 @@
diff -urNp coreutils-8.21-orig/gnulib-tests/gnulib.mk coreutils-8.21/gnulib-tests/gnulib.mk
--- coreutils-8.21-orig/gnulib-tests/gnulib.mk 2013-02-07 17:58:44.000000000 +0100
+++ coreutils-8.21/gnulib-tests/gnulib.mk 2013-02-15 10:12:28.110593165 +0100
@@ -267,9 +267,9 @@ EXTRA_DIST += nap.h test-chown.h test-ch
## begin gnulib module cloexec-tests
-TESTS += test-cloexec
-check_PROGRAMS += test-cloexec
-EXTRA_DIST += test-cloexec.c macros.h
+#TESTS += test-cloexec
+#check_PROGRAMS += test-cloexec
+#EXTRA_DIST += test-cloexec.c macros.h
## end gnulib module cloexec-tests
@@ -378,9 +378,9 @@ EXTRA_DIST += test-dup.c signature.h mac
## begin gnulib module dup2-tests
-TESTS += test-dup2
-check_PROGRAMS += test-dup2
-EXTRA_DIST += test-dup2.c signature.h macros.h
+#TESTS += test-dup2
+#check_PROGRAMS += test-dup2
+#EXTRA_DIST += test-dup2.c signature.h macros.h
## end gnulib module dup2-tests
@@ -439,10 +439,10 @@ EXTRA_DIST += test-fadvise.c
## begin gnulib module fchdir-tests
-TESTS += test-fchdir
-check_PROGRAMS += test-fchdir
-test_fchdir_LDADD = $(LDADD) $(LIBINTL)
-EXTRA_DIST += test-fchdir.c signature.h macros.h
+#TESTS += test-fchdir
+#check_PROGRAMS += test-fchdir
+#test_fchdir_LDADD = $(LDADD) $(LIBINTL)
+#EXTRA_DIST += test-fchdir.c signature.h macros.h
## end gnulib module fchdir-tests
@@ -874,9 +874,9 @@ EXTRA_DIST += test-getloadavg.c signatur
## begin gnulib module getlogin-tests
-TESTS += test-getlogin
-check_PROGRAMS += test-getlogin
-EXTRA_DIST += test-getlogin.c signature.h macros.h
+#TESTS += test-getlogin
+#check_PROGRAMS += test-getlogin
+#EXTRA_DIST += test-getlogin.c signature.h macros.h
## end gnulib module getlogin-tests
@@ -1119,10 +1119,10 @@ EXTRA_DIST += test-link.h test-link.c si
## begin gnulib module linkat-tests
-TESTS += test-linkat
-check_PROGRAMS += test-linkat
-test_linkat_LDADD = $(LDADD) @LIBINTL@
-EXTRA_DIST += test-link.h test-linkat.c signature.h macros.h
+#TESTS += test-linkat
+#check_PROGRAMS += test-linkat
+#test_linkat_LDADD = $(LDADD) @LIBINTL@
+#EXTRA_DIST += test-link.h test-linkat.c signature.h macros.h
## end gnulib module linkat-tests
@@ -1331,9 +1331,9 @@ EXTRA_DIST += test-memcoll.c macros.h
## begin gnulib module memrchr-tests
-TESTS += test-memrchr
-check_PROGRAMS += test-memrchr
-EXTRA_DIST += test-memrchr.c zerosize-ptr.h signature.h macros.h
+#TESTS += test-memrchr
+#check_PROGRAMS += test-memrchr
+#EXTRA_DIST += test-memrchr.c zerosize-ptr.h signature.h macros.h
## end gnulib module memrchr-tests
@@ -1978,9 +1978,9 @@ EXTRA_DIST += test-statat.c
## begin gnulib module stdalign-tests
-TESTS += test-stdalign
-check_PROGRAMS += test-stdalign
-EXTRA_DIST += test-stdalign.c macros.h
+#TESTS += test-stdalign
+#check_PROGRAMS += test-stdalign
+#EXTRA_DIST += test-stdalign.c macros.h
## end gnulib module stdalign-tests
@@ -2323,9 +2323,9 @@ EXTRA_DIST += test-uname.c signature.h m
## begin gnulib module unistd-safer-tests
-TESTS += test-dup-safer
-check_PROGRAMS += test-dup-safer
-EXTRA_DIST += test-dup-safer.c macros.h
+#TESTS += test-dup-safer
+#check_PROGRAMS += test-dup-safer
+#EXTRA_DIST += test-dup-safer.c macros.h
## end gnulib module unistd-safer-tests
@@ -2438,10 +2438,10 @@ EXTRA_DIST += test-usleep.c signature.h
## begin gnulib module utimens-tests
-TESTS += test-utimens
-check_PROGRAMS += test-utimens
-test_utimens_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) $(LIB_NANOSLEEP) @LIBINTL@
-EXTRA_DIST += nap.h test-futimens.h test-lutimens.h test-utimens.h test-utimens-common.h test-utimens.c macros.h
+#TESTS += test-utimens
+#check_PROGRAMS += test-utimens
+#test_utimens_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) $(LIB_NANOSLEEP) @LIBINTL@
+#EXTRA_DIST += nap.h test-futimens.h test-lutimens.h test-utimens.h test-utimens-common.h test-utimens.c macros.h
## end gnulib module utimens-tests
diff -urNp coreutils-8.21-orig/tests/local.mk coreutils-8.21/tests/local.mk
--- coreutils-8.21-orig/tests/local.mk 2013-02-11 11:30:12.000000000 +0100
+++ coreutils-8.21/tests/local.mk 2013-02-15 10:10:55.890532258 +0100
@@ -131,6 +131,7 @@ all_root_tests = \
tests/rm/no-give-up.sh \
tests/rm/one-file-system.sh \
tests/rm/read-only.sh \
+ tests/tail-2/inotify-hash-abuse.sh \
tests/tail-2/append-only.sh \
tests/touch/now-owned-by-other.sh
@@ -163,7 +164,6 @@ all_tests = \
tests/cp/link-heap.sh \
tests/cp/no-ctx.sh \
tests/misc/tty-eof.pl \
- tests/tail-2/inotify-hash-abuse.sh \
tests/tail-2/inotify-hash-abuse2.sh \
tests/tail-2/F-vs-missing.sh \
tests/tail-2/F-vs-rename.sh \
diff -urNp coreutils-8.21-orig/tests/touch/no-dereference.sh coreutils-8.21/tests/touch/no-dereference.sh
--- coreutils-8.21-orig/tests/touch/no-dereference.sh 2013-01-31 01:46:25.000000000 +0100
+++ coreutils-8.21/tests/touch/no-dereference.sh 2013-02-15 10:10:55.889593383 +0100
@@ -42,6 +42,8 @@ test -f nowhere && fail=1
grep '^#define HAVE_UTIMENSAT 1' "$CONFIG_HEADER" > /dev/null ||
grep '^#define HAVE_LUTIMES 1' "$CONFIG_HEADER" > /dev/null ||
skip_ 'this system lacks the utimensat function'
+grep '^#define HAVE_WORKINGKOJI 1' "$CONFIG_HEADER" > /dev/null ||
+ skip_ 'rest of the test disabled due to koji lack of utimensat function'
# Changing time of dangling symlink is okay.
# Skip the test if this fails, but the error text corresponds to

13
SOURCES/coreutils-6.10-manpages.patch

@ -0,0 +1,13 @@
diff -urNp coreutils-6.12-orig/src/md5sum.c coreutils-6.12/src/md5sum.c
--- coreutils-6.12-orig/src/md5sum.c 2008-05-26 08:40:33.000000000 +0200
+++ coreutils-6.12/src/md5sum.c 2008-10-21 16:07:28.000000000 +0200
@@ -175,6 +175,9 @@ With no FILE, or when FILE is -, read st
fputs (_("\
-t, --text read in text mode (default)\n\
"), stdout);
+ fputs (_("\
+ Note: There is no difference between binary and text mode option on GNU system.\n\
+"), stdout);
fputs (_("\
\n\
The following four options are useful only when verifying checksums:\n\

12
SOURCES/coreutils-7.4-sttytcsadrain.patch

@ -0,0 +1,12 @@
diff -urNp coreutils-8.13-orig/src/stty.c coreutils-8.13/src/stty.c
--- coreutils-8.13-orig/src/stty.c 2011-07-28 12:38:27.000000000 +0200
+++ coreutils-8.13/src/stty.c 2011-09-09 10:18:57.526687209 +0200
@@ -1005,7 +1005,7 @@ main (int argc, char **argv)
spurious difference in an uninitialized portion of the structure. */
static struct termios new_mode;
- if (tcsetattr (STDIN_FILENO, TCSADRAIN, &mode))
+ if (tcsetattr (STDIN_FILENO, TCSANOW, &mode))
error (EXIT_FAILURE, errno, "%s", device_name);
/* POSIX (according to Zlotnick's book) tcsetattr returns zero if

49
SOURCES/coreutils-8.2-uname-processortype.patch

@ -0,0 +1,49 @@
diff -urNp coreutils-8.2-orig/src/uname.c coreutils-8.2/src/uname.c
--- coreutils-8.2-orig/src/uname.c 2009-09-23 10:25:44.000000000 +0200
+++ coreutils-8.2/src/uname.c 2009-12-19 09:09:11.663607110 +0100
@@ -301,7 +301,7 @@ main (int argc, char **argv)
if (toprint & PRINT_PROCESSOR)
{
- char const *element = unknown;
+ char *element = unknown;
#if HAVE_SYSINFO && defined SI_ARCHITECTURE
{
static char processor[257];
@@ -308,6 +308,12 @@ main (int argc, char **argv)
if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor))
element = processor;
}
+#else
+ {
+ static struct utsname u;
+ uname(&u);
+ element = u.machine;
+ }
#endif
#ifdef UNAME_PROCESSOR
if (element == unknown)
@@ -351,7 +357,7 @@ main (int argc, char **argv)
if (toprint & PRINT_HARDWARE_PLATFORM)
{
- char const *element = unknown;
+ char *element = unknown;
#if HAVE_SYSINFO && defined SI_PLATFORM
{
static char hardware_platform[257];
@@ -353,6 +359,14 @@ main (int argc, char **argv)
hardware_platform, sizeof hardware_platform))
element = hardware_platform;
}
+#else
+ {
+ static struct utsname u;
+ uname(&u);
+ element = u.machine;
+ if(strlen(element)==4 && element[0]=='i' && element[2]=='8' && element[3]=='6')
+ element[1]='3';
+ }
#endif
#ifdef UNAME_HARDWARE_PLATFORM
if (element == unknown)

109
SOURCES/coreutils-8.22-cp-selinux.patch

@ -0,0 +1,109 @@
From 2b3b5bfcd5f4161d17c0bc3d43f6edcfc4a2b294 Mon Sep 17 00:00:00 2001
From: Nicolas Looss <nicolas.iooss@m4x.org>
Date: Sat, 4 Jan 2014 03:03:51 +0000
Subject: [PATCH] copy: fix a segfault in SELinux context copying code

* src/selinux.c (restorecon_private): On ArchLinux the
`fakeroot cp -a file1 file2` command segfaulted due
to getfscreatecon() returning a NULL context.
So map this to the sometimes ignored ENODATA error,
rather than crashing.
* tests/cp/no-ctx.sh: Add a new test case.
* tests/local.mk: Reference the new test.
---
src/selinux.c | 5 ++++
tests/cp/no-ctx.sh | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/local.mk | 1 +
3 files changed, 59 insertions(+), 0 deletions(-)
create mode 100755 tests/cp/no-ctx.sh

diff --git a/src/selinux.c b/src/selinux.c
index cd38a81..016db16 100644
--- a/src/selinux.c
+++ b/src/selinux.c
@@ -192,6 +192,11 @@ restorecon_private (char const *path, bool local)
{
if (getfscreatecon (&tcon) < 0)
return rc;
+ if (!tcon)
+ {
+ errno = ENODATA;
+ return rc;
+ }
rc = lsetfilecon (path, tcon);
freecon (tcon);
return rc;
diff --git a/tests/cp/no-ctx.sh b/tests/cp/no-ctx.sh
new file mode 100755
index 0000000..59d30de
--- /dev/null
+++ b/tests/cp/no-ctx.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+# Ensure we handle file systems returning no SELinux context,
+# which triggered a segmentation fault in coreutils-8.22.
+# This test is skipped on systems that lack LD_PRELOAD support; that's fine.
+# Similarly, on a system that lacks lgetfilecon altogether, skipping it is fine.
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
+print_ver_ cp
+require_gcc_shared_
+
+# Replace each getfilecon and lgetfilecon call with a call to these stubs.
+cat > k.c <<'EOF' || skip_
+#include <selinux/selinux.h>
+#include <errno.h>
+
+int getfilecon (const char *path, security_context_t *con)
+{ errno=ENODATA; return -1; }
+int lgetfilecon (const char *path, security_context_t *con)
+{ errno=ENODATA; return -1; }
+EOF
+
+# Then compile/link it:
+$CC -shared -fPIC -O2 k.c -o k.so \
+ || skip_ 'failed to build SELinux shared library'
+
+touch file_src
+
+# New file with SELinux context optionally included
+LD_PRELOAD=./k.so cp -a file_src file_dst || fail=1
+
+# Existing file with SELinux context optionally included
+LD_PRELOAD=./k.so cp -a file_src file_dst || fail=1
+
+# ENODATA should give an immediate error when required to preserve ctx
+# This is debatable, and maybe we should not fail when no context available?
+LD_PRELOAD=./k.so cp --preserve=context file_src file_dst && fail=1
+
+Exit $fail
diff --git a/tests/local.mk b/tests/local.mk
index dc7341c..9d556f6 100644
--- a/tests/local.mk
+++ b/tests/local.mk
@@ -161,6 +161,7 @@ all_tests = \
tests/rm/ext3-perf.sh \
tests/rm/cycle.sh \
tests/cp/link-heap.sh \
+ tests/cp/no-ctx.sh \
tests/misc/tty-eof.pl \
tests/tail-2/inotify-hash-abuse.sh \
tests/tail-2/inotify-hash-abuse2.sh \
--
1.7.7.6

279
SOURCES/coreutils-8.22-cp-sparsecorrupt.patch

@ -0,0 +1,279 @@
From eea6b49210edf69682b2d0606bee17bbccb3765b Mon Sep 17 00:00:00 2001
From: Dmitry Monakhov <dmonakhov@openvz.org>
Date: Fri, 30 Oct 2015 22:04:46 +0000
Subject: [PATCH] copy: fix copying of extents beyond the apparent file size

fallocate can allocate extents beyond EOF via FALLOC_FL_KEEP_SIZE.
Where there is a gap (hole) between the extents, and EOF is within
that gap, the final hole wasn't reproduced, resulting in silent
data corruption in the copied file (size too small).

* src/copy.c (extent_copy): Ensure we don't process extents
beyond the apparent file size, since processing and allocating
those is not currently supported.
* tests/cp/fiemap-extents.sh: Renamed from tests/cp/fiemap-empty.sh
and re-enable parts checking the extents at and beyond EOF.
* tests/local.mk: Reference the renamed test.
Fixes http://bugs.gnu.org/21790
---
src/copy.c | 19 ++++++++-
tests/cp/fiemap-empty.sh | 102 --------------------------------------------
tests/cp/fiemap-extents.sh | 81 +++++++++++++++++++++++++++++++++++
tests/local.mk | 2 +-
5 files changed, 100 insertions(+), 104 deletions(-)
delete mode 100755 tests/cp/fiemap-empty.sh
create mode 100755 tests/cp/fiemap-extents.sh

diff --git a/src/copy.c b/src/copy.c
index dc1cd29..6771bb5 100644
--- a/src/copy.c
+++ b/src/copy.c
@@ -432,6 +432,20 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,
ext_len = 0;
}
+ /* Truncate extent to EOF. Extents starting after EOF are
+ treated as zero length extents starting right after EOF.
+ Generally this will trigger with an extent starting after
+ src_total_size, and result in creating a hole or zeros until EOF.
+ Though in a file in which extents have changed since src_total_size
+ was determined, we might have an extent spanning that size,
+ in which case we'll only copy data up to that size. */
+ if (src_total_size < ext_start + ext_len)
+ {
+ if (src_total_size < ext_start)
+ ext_start = src_total_size;
+ ext_len = src_total_size - ext_start;
+ }
+
hole_size = ext_start - last_ext_start - last_ext_len;
wrote_hole_at_eof = false;
@@ -495,14 +509,17 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,
off_t n_read;
empty_extent = false;
last_ext_len = ext_len;
+ bool read_hole;
if ( ! sparse_copy (src_fd, dest_fd, buf, buf_size,
sparse_mode == SPARSE_ALWAYS,
src_name, dst_name, ext_len, &n_read,
- &wrote_hole_at_eof))
+ &read_hole))
goto fail;
dest_pos = ext_start + n_read;
+ if (n_read)
+ wrote_hole_at_eof = read_hole;
}
/* If the file ends with unwritten extents not accounted for in the
deleted file mode 100755
index b3b2cd7..0000000
--- a/tests/cp/fiemap-empty.sh
+++ /dev/null
@@ -1,101 +0,0 @@
-#!/bin/sh
-# Test cp reads unwritten extents efficiently
-
-# Copyright (C) 2011-2013 Free Software Foundation, Inc.
-
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
-print_ver_ cp
-
-# FIXME: enable any part of this test that is still relevant,
-# or, if none are relevant (now that cp does not handle unwritten
-# extents), just remove the test altogether.
-skip_ 'disabled for now'
-
-touch fiemap_chk
-fiemap_capable_ fiemap_chk ||
- skip_ 'this file system lacks FIEMAP support'
-rm fiemap_chk
-
-# TODO: rather than requiring $(fallocate), possible add
-# this functionality to truncate --alloc
-fallocate --help >/dev/null || skip_ 'The fallocate utility is required'
-fallocate -l 1 -n falloc.test ||
- skip_ 'this file system lacks FALLOCATE support'
-rm falloc.test
-
-# Require more space than we'll actually use, so that
-# tests run in parallel do not run out of space.
-# Otherwise, with inadequate space, simply running the following
-# fallocate command would induce a temporary disk-full condition,
-# which would cause failure of unrelated tests run in parallel.
-require_file_system_bytes_free_ 800000000
-
-fallocate -l 600MiB space.test ||
- skip_ 'this test needs at least 600MiB free space'
-
-# Disable this test on old BTRFS (e.g. Fedora 14)
-# which reports ordinary extents for unwritten ones.
-filefrag space.test || skip_ 'the 'filefrag' utility is missing'
-filefrag -v space.test | grep -F 'unwritten' > /dev/null ||
- skip_ 'this file system does not report empty extents as "unwritten"'
-
-rm space.test
-
-# Ensure we read a large empty file quickly
-fallocate -l 300MiB empty.big || framework_failure_
-timeout 3 cp --sparse=always empty.big cp.test || fail=1
-test $(stat -c %s empty.big) = $(stat -c %s cp.test) || fail=1
-rm empty.big cp.test
-
-# Ensure we handle extents beyond file size correctly.
-# Note until we support fallocate, we will not maintain
-# the file allocation. FIXME: amend this test when fallocate is supported.
-fallocate -l 10MiB -n unwritten.withdata || framework_failure_
-dd count=10 if=/dev/urandom conv=notrunc iflag=fullblock of=unwritten.withdata
-cp unwritten.withdata cp.test || fail=1
-test $(stat -c %s unwritten.withdata) = $(stat -c %s cp.test) || fail=1
-cmp unwritten.withdata cp.test || fail=1
-rm unwritten.withdata cp.test
-
-# The following to generate unaccounted extents followed by a hole, is not
-# supported by ext4 at least. The ftruncate discards all extents not
-# accounted for in the size.
-# fallocate -l 10MiB -n unacc.withholes
-# dd count=10 if=/dev/urandom conv=notrunc iflag=fullblock of=unacc.withholes
-# truncate -s20M unacc.withholes
-
-# Ensure we handle a hole after empty extents correctly.
-# Since all extents are accounted for in the size,
-# we can maintain the allocation independently from
-# fallocate() support.
-fallocate -l 10MiB empty.withholes
-truncate -s 20M empty.withholes
-sectors_per_block=$(expr $(stat -c %o .) / 512)
-cp empty.withholes cp.test || fail=1
-test $(stat -c %s empty.withholes) = $(stat -c %s cp.test) || fail=1
-# These are usually equal but can vary by an IO block due to alignment
-alloc_diff=$(expr $(stat -c %b empty.withholes) - $(stat -c %b cp.test))
-alloc_diff=$(echo $alloc_diff | tr -d -- -) # abs()
-test $alloc_diff -le $sectors_per_block || fail=1
-# Again with SPARSE_ALWAYS
-cp --sparse=always empty.withholes cp.test || fail=1
-test $(stat -c %s empty.withholes) = $(stat -c %s cp.test) || fail=1
-# cp.test should take 0 space, but allowing for some systems
-# that store default extended attributes in data blocks
-test $(stat -c %b cp.test) -le $sectors_per_block || fail=1
-rm empty.withholes cp.test
-
-Exit $fail
diff --git a/tests/cp/fiemap-extents.sh b/tests/cp/fiemap-extents.sh
new file mode 100755
index 0000000..55ec5df
--- /dev/null
+++ b/tests/cp/fiemap-extents.sh
@@ -0,0 +1,81 @@
+#!/bin/sh
+# Test cp handles extents correctly
+
+# Copyright (C) 2011-2015 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
+print_ver_ cp
+
+require_sparse_support_
+
+touch fiemap_chk
+fiemap_capable_ fiemap_chk ||
+ skip_ 'this file system lacks FIEMAP support'
+rm fiemap_chk
+
+fallocate --help >/dev/null || skip_ 'The fallocate utility is required'
+touch falloc.test || framework_failure_
+fallocate -l 1 -o 0 -n falloc.test ||
+ skip_ 'this file system lacks FALLOCATE support'
+rm falloc.test
+
+# We don't currently handle unwritten extents specially
+if false; then
+# Require more space than we'll actually use, so that
+# tests run in parallel do not run out of space.
+# Otherwise, with inadequate space, simply running the following
+# fallocate command would induce a temporary disk-full condition,
+# which would cause failure of unrelated tests run in parallel.
+require_file_system_bytes_free_ 800000000
+
+fallocate -l 600MiB space.test ||
+ skip_ 'this test needs at least 600MiB free space'
+
+# Disable this test on old BTRFS (e.g. Fedora 14)
+# which reports ordinary extents for unwritten ones.
+filefrag space.test || skip_ 'the 'filefrag' utility is missing'
+filefrag -v space.test | grep -F 'unwritten' > /dev/null ||
+ skip_ 'this file system does not report empty extents as "unwritten"'
+
+rm space.test
+
+# Ensure we read a large empty file quickly
+fallocate -l 300MiB empty.big || framework_failure_
+timeout 3 cp --sparse=always empty.big cp.test || fail=1
+test $(stat -c %s empty.big) = $(stat -c %s cp.test) || fail=1
+rm empty.big cp.test
+fi
+
+# Ensure we handle extents beyond file size correctly.
+# Note until we support fallocate, we will not maintain
+# the file allocation. FIXME: amend this test if fallocate is supported.
+# Note currently this only uses fiemap logic when the allocation (-l)
+# is smaller than the size, thus identifying the file as sparse.
+# Note the '-l 1' case is an effective noop, and just checks
+# a file with a trailing hole is copied correctly.
+for sparse_mode in always auto never; do
+ for alloc in '-l 4MiB ' '-l 1MiB -o 4MiB' '-l 1'; do
+ dd count=10 if=/dev/urandom iflag=fullblock of=unwritten.withdata
+ truncate -s 2MiB unwritten.withdata || framework_failure_
+ fallocate $alloc -n unwritten.withdata || framework_failure_
+ cp --sparse=$sparse_mode unwritten.withdata cp.test || fail=1
+ test $(stat -c %s unwritten.withdata) = $(stat -c %s cp.test) || fail=1
+ cmp unwritten.withdata cp.test || fail=1
+ rm unwritten.withdata cp.test
+ done
+done
+
+Exit $fail
diff --git a/tests/local.mk b/tests/local.mk
index adf96f0..89fdbb0 100644
--- a/tests/local.mk
+++ b/tests/local.mk
@@ -446,7 +446,7 @@ all_tests = \
tests/cp/existing-perm-dir.sh \
tests/cp/existing-perm-race.sh \
tests/cp/fail-perm.sh \
- tests/cp/fiemap-empty.sh \
+ tests/cp/fiemap-extents.sh \
tests/cp/fiemap-FMR.sh \
tests/cp/fiemap-perf.sh \
tests/cp/fiemap-2.sh \
--
1.7.2.5

46
SOURCES/coreutils-8.22-date-emptyTZ.patch

@ -0,0 +1,46 @@
From a10acfb1d2118f9a180181d3fed5399dbbe1df3c Mon Sep 17 00:00:00 2001
From: Pádraig Brady <P@draigBrady.com>
Date: Tue, 25 Feb 2014 10:58:48 +0000
Subject: parse-datetime: fix crash or infloop in TZ="" parsing

This was reported in http://bugs.gnu.org/16872
from the coreutils command: date -d 'TZ="""'

The infinite loop for this case was present since the
initial TZ="" parsing support in commit de95bdc2 29-10-2004.
This was changed to a crash or heap corruption depending
on the platform with commit 2e3e4195 18-01-2010.

* lib/parse-datetime.y (parse_datetime): Break out of the
TZ="" parsing loop once the second significant " is found.
Also skip over any subsequent whitespace to be consistent
with the non TZ= case.
---
diff --git a/lib/parse-datetime.y b/lib/parse-datetime.y
index 6ece765..0ba0a52 100644
--- a/lib/parse-datetime.y
+++ b/lib/parse-datetime.y
@@ -1303,8 +1303,6 @@ parse_datetime (struct timespec *result, char const *p,
char tz1buf[TZBUFSIZE];
bool large_tz = TZBUFSIZE < tzsize;
bool setenv_ok;
- /* Free tz0, in case this is the 2nd or subsequent time through. */
- free (tz0);
tz0 = get_tz (tz0buf);
z = tz1 = large_tz ? xmalloc (tzsize) : tz1buf;
for (s = tzbase; *s != '"'; s++)
@@ -1316,7 +1314,12 @@ parse_datetime (struct timespec *result, char const *p,
if (!setenv_ok)
goto fail;
tz_was_altered = true;
+
p = s + 1;
+ while (c = *p, c_isspace (c))
+ p++;
+
+ break;
}
}
--
cgit v0.9.0.2

479
SOURCES/coreutils-8.22-dd-progress.patch

@ -0,0 +1,479 @@
From af2a4ed22594badd2719c0123441d69b17bd8328 Mon Sep 17 00:00:00 2001
From: Federico Simoncelli <fsimonce@redhat.com>
Date: Fri, 26 Sep 2014 17:12:32 +0000
Subject: [PATCH] dd: new status=progress level to print stats periodically

* src/dd.c: Report the transfer progress every second when the
new status=progress level is used. Adjust the handling and
description of the status= option so that they're treated as
mutually exclusive levels, rather than flags with implicit precedence.
* doc/coreutils.texi (dd invocation): Document the new progress
status level. Reference the new level in the description of SIGUSR1.
* tests/dd/stats.sh: Add new test for status=progress.
* tests/dd/misc.sh: Change so status=none only takes precedence
if it's the last level specified.
---
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
index 7d32af5..03bb710 100644
--- a/doc/coreutils.texi
+++ b/doc/coreutils.texi
@@ -8631,24 +8631,32 @@ will ensure that @samp{count=} corresponds to complete input blocks
rather than the traditional POSIX specified behavior of counting
input read operations.
-@item status=@var{which}
+@item status=@var{level}
@opindex status
Transfer information is normally output to stderr upon
receipt of the @samp{INFO} signal or when @command{dd} exits.
-Specifying @var{which} will identify which information to suppress.
+Specifying @var{level} will adjust the amount of information printed,
+with the last @var{level} specified taking precedence.
@table @samp
-@item noxfer
-@opindex noxfer @r{dd status=}
-Do not print the transfer rate and volume statistics
-that normally make up the last status line.
-
@item none
@opindex none @r{dd status=}
Do not print any informational or warning messages to stderr.
Error messages are output as normal.
+@item noxfer
+@opindex noxfer @r{dd status=}
+Do not print the final transfer rate and volume statistics
+that normally make up the last status line.
+
+@item progress
+@opindex progress @r{dd status=}
+Print the transfer rate and volume statistics on stderr,
+when processing each input block. Statistics are output
+on a single line at most once every second, but updates
+can be delayed when waiting on I/O.
+
@end table
@item conv=@var{conversion}[,@var{conversion}]@dots{}
@@ -9033,6 +9041,9 @@ The above script will output in the following format
5120000000 bytes (5.1 GB) copied, 18.913 seconds, 271 MB/s
@end example
+Note also the @samp{status=progress} option which periodically updates
+the last line of the transfer statistics above.
+
@vindex POSIXLY_CORRECT
On systems lacking the @samp{INFO} signal @command{dd} responds to the
@samp{USR1} signal instead, unless the @env{POSIXLY_CORRECT}
diff --git a/src/dd.c b/src/dd.c
index d22ec59..4018190 100644
--- a/src/dd.c
+++ b/src/dd.c
@@ -34,6 +34,7 @@
#include "long-options.h"
#include "quote.h"
#include "quotearg.h"
+#include "verror.h"
#include "xstrtol.h"
#include "xtime.h"
@@ -132,11 +133,13 @@ enum
C_SPARSE = 0200000
};
-/* Status bit masks. */
+/* Status levels. */
enum
{
- STATUS_NOXFER = 01,
- STATUS_NONE = 02
+ STATUS_NONE = 1,
+ STATUS_NOXFER = 2,
+ STATUS_DEFAULT = 3,
+ STATUS_PROGRESS = 4
};
/* The name of the input file, or NULL for the standard input. */
@@ -188,7 +191,7 @@ static int input_flags = 0;
static int output_flags = 0;
/* Status flags for what is printed to stderr. */
-static int status_flags = 0;
+static int status_level = STATUS_DEFAULT;
/* If nonzero, filter characters through the translation table. */
static bool translation_needed = false;
@@ -211,6 +214,12 @@ static uintmax_t w_bytes = 0;
/* Time that dd started. */
static xtime_t start_time;
+/* Previous time for periodic progress. */
+static xtime_t previous_time;
+
+/* Whether a '\n' is pending after writing progress. */
+static bool newline_pending;
+
/* True if input is seekable. */
static bool input_seekable;
@@ -373,8 +382,9 @@ static struct symbol_value const flags[] =
/* Status, for status="...". */
static struct symbol_value const statuses[] =
{
- {"noxfer", STATUS_NOXFER},
{"none", STATUS_NONE},
+ {"noxfer", STATUS_NOXFER},
+ {"progress", STATUS_PROGRESS},
{"", 0}
};
@@ -517,6 +527,25 @@ maybe_close_stdout (void)
_exit (EXIT_FAILURE);
}
+/* Like error() but handle any pending newline. */
+
+static void _GL_ATTRIBUTE_FORMAT ((__printf__, 3, 4))
+nl_error (int status, int errnum, const char *fmt, ...)
+{
+ if (newline_pending)
+ {
+ fputc ('\n', stderr);
+ newline_pending = false;
+ }
+
+ va_list ap;
+ va_start (ap, fmt);
+ verror (status, errnum, fmt, ap);
+ va_end (ap);
+}
+
+#define error nl_error
+
void
usage (int status)
{
@@ -546,8 +575,10 @@ Copy a file, converting and formatting according to the operands.\n\
oflag=FLAGS write as per the comma separated symbol list\n\
seek=N skip N obs-sized blocks at start of output\n\
skip=N skip N ibs-sized blocks at start of input\n\
- status=WHICH WHICH info to suppress outputting to stderr;\n\
- 'noxfer' suppresses transfer stats, 'none' suppresses all\n\
+ status=LEVEL The LEVEL of information to print to stderr;\n\
+ 'none' suppresses everything but error messages,\n\
+ 'noxfer' suppresses the final transfer statistics,\n\
+ 'progress' shows periodic transfer statistics\n\
"), stdout);
fputs (_("\
\n\
@@ -724,8 +755,7 @@ multiple_bits_set (int i)
/* Print transfer statistics. */
static void
-print_stats (void)
-{
+print_xfer_stats (xtime_t progress_time) {
char hbuf[LONGEST_HUMAN_READABLE + 1];
int human_opts =
(human_autoscale | human_round_to_nearest
@@ -733,23 +763,8 @@ print_stats (void)
double delta_s;
char const *bytes_per_second;
- if (status_flags & STATUS_NONE)
- return;
-
- fprintf (stderr,
- _("%"PRIuMAX"+%"PRIuMAX" records in\n"
- "%"PRIuMAX"+%"PRIuMAX" records out\n"),
- r_full, r_partial, w_full, w_partial);
-
- if (r_truncate != 0)
- fprintf (stderr,
- ngettext ("%"PRIuMAX" truncated record\n",
- "%"PRIuMAX" truncated records\n",
- select_plural (r_truncate)),
- r_truncate);
-
- if (status_flags & STATUS_NOXFER)
- return;
+ if (progress_time)
+ fputc ('\r', stderr);
/* Use integer arithmetic to compute the transfer rate,
since that makes it easy to use SI abbreviations. */
@@ -761,7 +776,8 @@ print_stats (void)
w_bytes,
human_readable (w_bytes, hbuf, human_opts, 1, 1));
- xtime_t now = gethrxtime ();
+ xtime_t now = progress_time ? progress_time : gethrxtime ();
+
if (start_time < now)
{
double XTIME_PRECISIONe0 = XTIME_PRECISION;
@@ -787,7 +803,42 @@ print_stats (void)
but that was incorrect for languages like Polish. To fix this
bug we now use SI symbols even though they're a bit more
confusing in English. */
- fprintf (stderr, _(", %g s, %s/s\n"), delta_s, bytes_per_second);
+ char const *time_fmt = _(", %g s, %s/s\n");;
+ if (progress_time)
+ time_fmt = _(", %.6f s, %s/s"); /* OK with '\r' as increasing width. */
+ fprintf (stderr, time_fmt, delta_s, bytes_per_second);
+
+ newline_pending = !!progress_time;
+}
+
+static void
+print_stats (void)
+{
+ if (status_level == STATUS_NONE)
+ return;
+
+ if (newline_pending)
+ {
+ fputc ('\n', stderr);
+ newline_pending = false;
+ }
+
+ fprintf (stderr,
+ _("%"PRIuMAX"+%"PRIuMAX" records in\n"
+ "%"PRIuMAX"+%"PRIuMAX" records out\n"),
+ r_full, r_partial, w_full, w_partial);
+
+ if (r_truncate != 0)
+ fprintf (stderr,
+ ngettext ("%"PRIuMAX" truncated record\n",
+ "%"PRIuMAX" truncated records\n",
+ select_plural (r_truncate)),
+ r_truncate);
+
+ if (status_level == STATUS_NOXFER)
+ return;
+
+ print_xfer_stats (0);
}
/* An ordinary signal was received; arrange for the program to exit. */
@@ -1035,7 +1086,7 @@ iread (int fd, char *buf, size_t size)
if (0 < prev_nread && prev_nread < size)
{
uintmax_t prev = prev_nread;
- if (!(status_flags & STATUS_NONE))
+ if (status_level != STATUS_NONE)
error (0, 0, ngettext (("warning: partial read (%"PRIuMAX" byte); "
"suggest iflag=fullblock"),
("warning: partial read (%"PRIuMAX" bytes); "
@@ -1086,7 +1137,7 @@ iwrite (int fd, char const *buf, size_t size)
{
int old_flags = fcntl (STDOUT_FILENO, F_GETFL);
if (fcntl (STDOUT_FILENO, F_SETFL, old_flags & ~O_DIRECT) != 0
- && !(status_flags & STATUS_NONE))
+ && status_level != STATUS_NONE)
error (0, errno, _("failed to turn off O_DIRECT: %s"),
quote (output_file));
@@ -1219,7 +1270,7 @@ operand_matches (char const *str, char const *pattern, char delim)
static int
parse_symbols (char const *str, struct symbol_value const *table,
- char const *error_msgid)
+ bool exclusive, char const *error_msgid)
{
int value = 0;
@@ -1241,7 +1292,10 @@ parse_symbols (char const *str, struct symbol_value const *table,
}
}
- value |= entry->value;
+ if (exclusive)
+ value = entry->value;
+ else
+ value |= entry->value;
if (!strcomma)
break;
str = strcomma + 1;
@@ -1316,17 +1370,17 @@ scanargs (int argc, char *const *argv)
else if (operand_is (name, "of"))
output_file = val;
else if (operand_is (name, "conv"))
- conversions_mask |= parse_symbols (val, conversions,
+ conversions_mask |= parse_symbols (val, conversions, false,
N_("invalid conversion"));
else if (operand_is (name, "iflag"))
- input_flags |= parse_symbols (val, flags,
+ input_flags |= parse_symbols (val, flags, false,
N_("invalid input flag"));
else if (operand_is (name, "oflag"))
- output_flags |= parse_symbols (val, flags,
+ output_flags |= parse_symbols (val, flags, false,
N_("invalid output flag"));
else if (operand_is (name, "status"))
- status_flags |= parse_symbols (val, statuses,
- N_("invalid status flag"));
+ status_level = parse_symbols (val, statuses, true,
+ N_("invalid status level"));
else
{
bool invalid = false;
@@ -1613,7 +1667,7 @@ skip_via_lseek (char const *filename, int fdesc, off_t offset, int whence)
&& ioctl (fdesc, MTIOCGET, &s2) == 0
&& MT_SAME_POSITION (s1, s2))
{
- if (!(status_flags & STATUS_NONE))
+ if (status_level != STATUS_NONE)
error (0, 0, _("warning: working around lseek kernel bug for file "
"(%s)\n of mt_type=0x%0lx -- "
"see <sys/mtio.h> for the list of types"),
@@ -1787,7 +1841,7 @@ advance_input_after_read_error (size_t nbytes)
if (offset == input_offset)
return true;
diff = input_offset - offset;
- if (! (0 <= diff && diff <= nbytes) && !(status_flags & STATUS_NONE))
+ if (! (0 <= diff && diff <= nbytes) && status_level != STATUS_NONE)
error (0, 0, _("warning: invalid file offset after failed read"));
if (0 <= skip_via_lseek (input_file, STDIN_FILENO, diff, SEEK_CUR))
return true;
@@ -1986,7 +2040,7 @@ dd_copy (void)
2. pipe has not enough data
3. partial reads */
if ((us_blocks || (!input_offset_overflow && us_bytes))
- && !(status_flags & STATUS_NONE))
+ && status_level != STATUS_NONE)
{
error (0, 0,
_("%s: cannot skip to specified offset"), quote (input_file));
@@ -2029,6 +2083,19 @@ dd_copy (void)
while (1)
{
+ if (status_level == STATUS_PROGRESS)
+ {
+ xtime_t progress_time = gethrxtime ();
+ uintmax_t delta_xtime = progress_time;
+ delta_xtime -= previous_time;
+ double XTIME_PRECISIONe0 = XTIME_PRECISION;
+ if (delta_xtime / XTIME_PRECISIONe0 > 1)
+ {
+ print_xfer_stats (progress_time);
+ previous_time = progress_time;
+ }
+ }
+
if (r_partial + r_full >= max_records + !!max_bytes)
break;
@@ -2053,7 +2120,7 @@ dd_copy (void)
if (nread < 0)
{
- if (!(conversions_mask & C_NOERROR) || !(status_flags & STATUS_NONE))
+ if (!(conversions_mask & C_NOERROR) || status_level != STATUS_NONE)
error (0, errno, _("error reading %s"), quote (input_file));
if (conversions_mask & C_NOERROR)
@@ -2345,7 +2412,7 @@ main (int argc, char **argv)
}
}
- start_time = gethrxtime ();
+ start_time = previous_time = gethrxtime ();
exit_status = dd_copy ();
diff --git a/tests/dd/misc.sh b/tests/dd/misc.sh
index f877fdd..34dfba7 100755
--- a/tests/dd/misc.sh
+++ b/tests/dd/misc.sh
@@ -35,9 +35,12 @@ dd status=none if=$tmp_in of=/dev/null 2> err || fail=1
test -s err && { cat err; fail=1; }
dd status=none if=$tmp_in skip=2 of=/dev/null 2> err || fail=1
test -s err && { cat err; fail=1; }
-# check status=none is cumulative with status=noxfer
-dd status=none status=noxfer if=$tmp_in of=/dev/null 2> err || fail=1
+# check later status=none overrides earlier status=noxfer
+dd status=noxfer status=none if=$tmp_in of=/dev/null 2> err || fail=1
test -s err && { cat err; fail=1; }
+# check later status=noxfer overrides earlier status=none
+dd status=none status=noxfer if=$tmp_in of=/dev/null 2> err || fail=1
+compare /dev/null err && fail=1
dd if=$tmp_in of=$tmp_out 2> /dev/null || fail=1
compare $tmp_in $tmp_out || fail=1
diff --git a/tests/dd/stats.sh b/tests/dd/stats.sh
new file mode 100755
index 0000000..24b8c49 100755
--- /dev/null
+++ b/tests/dd/stats.sh
@@ -0,0 +1,65 @@
+#!/bin/sh
+# Check stats output for SIG{INFO,USR1} and status=progress
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
+print_ver_ dd
+
+env kill -l | grep '^INFO$' && SIGINFO='INFO' || SIGINFO='USR1'
+
+# This to avoid races in the USR1 case
+# as the dd process will terminate by default until
+# it has its handler enabled.
+trap '' $SIGINFO
+
+mkfifo_or_skip_ fifo
+
+for open in '' '1'; do
+ # Run dd with the fullblock iflag to avoid short reads
+ # which can be triggered by reception of signals
+ dd iflag=fullblock if=/dev/zero of=fifo count=100 bs=5000000 2>err & pid=$!
+
+ # Note if we sleep here we give dd a chance to exec and block on open.
+ # Otherwise we're probably testing SIG_IGN in the forked shell or early dd.
+ test "$open" && sleep .1
+
+ # dd will block on open until fifo is opened for reading.
+ # Timeout in case dd goes away erroneously which we check for below.
+ timeout 10 sh -c 'wc -c < fifo > nwritten' &
+
+ # Send lots of signals immediately to ensure dd not killed due
+ # to race setting handler, or blocking on open of fifo.
+ # Many signals also check that short reads are handled.
+ until ! kill -s $SIGINFO $pid 2>/dev/null; do
+ sleep .01
+ done
+
+ wait
+
+ # Ensure all data processed and at least last status written
+ grep '500000000 bytes .* copied' err || { cat err; fail=1; }
+done
+
+progress_output()
+{
+ { sleep "$1"; echo 1; } | dd bs=1 status=progress of=/dev/null 2>err
+ # Progress output should be for "byte ... copied", while final is "bytes ..."
+ grep 'byte .* copied' err
+}
+retry_delay_ progress_output 1 4 || { cat err; fail=1; }
+
+Exit $fail
--
cgit v0.9.0.2

40
SOURCES/coreutils-8.22-df-autofs.patch

@ -0,0 +1,40 @@
From ed936e1909a314febfdb9574bd10cc2d46d2b3e3 Mon Sep 17 00:00:00 2001
From: Kamil Dudka <kdudka@redhat.com>
Date: Fri, 19 Feb 2016 10:41:49 +0100
Subject: [PATCH] mountlist: recognize autofs-mounted remote file systems, too

Originally reported at: https://bugzilla.redhat.com/1309247
* lib/mountlist.c (ME_REMOTE): Return true if a file system is named
"-hosts" because it is used by autofs to mount remote file systems.

Upstream-commit: 781788eeb5d4d0b816698e8629300cd90a7379bd
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
lib/mountlist.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/lib/mountlist.c b/lib/mountlist.c
index b839cd1..17779f6 100644
--- a/lib/mountlist.c
+++ b/lib/mountlist.c
@@ -212,13 +212,15 @@ me_remote (char const *fs_name, char const *fs_type _GL_UNUSED)
#ifndef ME_REMOTE
/* A file system is "remote" if its Fs_name contains a ':'
- or if (it is of type (smbfs or cifs) and its Fs_name starts with '//'). */
+ or if (it is of type (smbfs or cifs) and its Fs_name starts with '//')
+ or Fs_name is equal to "-hosts" (used by autofs to mount remote fs). */
# define ME_REMOTE(Fs_name, Fs_type) \
(strchr (Fs_name, ':') != NULL \
|| ((Fs_name)[0] == '/' \
&& (Fs_name)[1] == '/' \
&& (strcmp (Fs_type, "smbfs") == 0 \
- || strcmp (Fs_type, "cifs") == 0)))
+ || strcmp (Fs_type, "cifs") == 0)) \
+ || (strcmp("-hosts", Fs_name) == 0))
#endif
#if MOUNTED_GETMNTINFO
--
2.5.0

513
SOURCES/coreutils-8.22-df-filtermountlistupdate.patch

@ -0,0 +1,513 @@
diff --git a/src/df.c b/src/df.c
index e28a656..fe222d9 100644
--- a/src/df.c
+++ b/src/df.c
@@ -45,12 +45,12 @@
/* Filled with device numbers of examined file systems to avoid
duplicities in output. */
-struct devlist
+static struct devlist
{
dev_t dev_num;
struct mount_entry *me;
struct devlist *next;
-};
+} *device_list;
/* If true, show even file systems with zero size or
uninteresting types. */
@@ -609,13 +609,10 @@ excluded_fstype (const char *fstype)
me_mountdir wins. */
static void
-filter_mount_list (void)
+filter_mount_list (bool devices_only)
{
struct mount_entry *me;
- /* Store of already-processed device numbers. */
- struct devlist *devlist_head = NULL;
-
/* Sort all 'wanted' entries into the list devlist_head. */
for (me = mount_list; me;)
{
@@ -623,41 +620,66 @@ filter_mount_list (void)
struct devlist *devlist;
struct mount_entry *discard_me = NULL;
- if (-1 == stat (me->me_mountdir, &buf))
+ /* Avoid stating remote file systems as that may hang.
+ On Linux we probably have me_dev populated from /proc/self/mountinfo,
+ however we still stat() in case another device was mounted later. */
+ if ((me->me_remote && show_local_fs)
+ || -1 == stat (me->me_mountdir, &buf))
{
- /* Stat failed - add ME to be able to complain about it later. */
+ /* If remote, and showing just local, add ME for filtering later.
+ If stat failed; add ME to be able to complain about it later. */
buf.st_dev = me->me_dev;
}
else
{
- /* If the device name is a real path name ... */
- if (strchr (me->me_devname, '/'))
- {
- /* ... try to find its device number in the devlist. */
- for (devlist = devlist_head; devlist; devlist = devlist->next)
- if (devlist->dev_num == buf.st_dev)
- break;
+ /* If we've already seen this device... */
+ for (devlist = device_list; devlist; devlist = devlist->next)
+ if (devlist->dev_num == buf.st_dev)
+ break;
- if (devlist)
+ if (devlist)
+ {
+ if (! print_grand_total && me->me_remote && devlist->me->me_remote
+ && ! STREQ (devlist->me->me_devname, me->me_devname))
{
+ /* Don't discard remote entries with different locations,
+ as these are more likely to be explicitly mounted.
+ However avoid this when producing a total to give
+ a more accurate value in that case. */
+ }
+ else if ((strchr (me->me_devname, '/')
+ /* let "real" devices with '/' in the name win. */
+ && ! strchr (devlist->me->me_devname, '/'))
+ /* let a shorter mountdir win. */
+ || (strlen (devlist->me->me_mountdir)
+ > strlen (me->me_mountdir))
+ /* let an entry overmounted on a new device win... */
+ || (! STREQ (devlist->me->me_devname, me->me_devname)
+ /* ... but only when matching an existing mnt point,
+ to avoid problematic replacement when given
+ inaccurate mount lists, seen with some chroot
+ environments for example. */
+ && STREQ (me->me_mountdir,
+ devlist->me->me_mountdir)))
+ {
+ /* Discard mount entry for existing device. */
+ discard_me = devlist->me;
+ devlist->me = me;
+ }
+ else
+ {
+ /* Discard mount entry currently being processed. */
discard_me = me;
-
- /* Let the shorter mountdir win. */
- if (! strchr (devlist->me->me_devname, '/')
- || (strlen (devlist->me->me_mountdir)
- > strlen (me->me_mountdir)))
- {
- discard_me = devlist->me;
- devlist->me = me;
- }
}
+
}
}
if (discard_me)
{
me = me->me_next;
- free_mount_entry (discard_me);
+ if (! devices_only)
+ free_mount_entry (discard_me);
}
else
{
@@ -665,28 +687,49 @@ filter_mount_list (void)
devlist = xmalloc (sizeof *devlist);
devlist->me = me;
devlist->dev_num = buf.st_dev;
- devlist->next = devlist_head;
- devlist_head = devlist;
+ devlist->next = device_list;
+ device_list = devlist;
me = me->me_next;
}
}
/* Finally rebuild the mount_list from the devlist. */
- mount_list = NULL;
- while (devlist_head)
+ if (! devices_only) {
+ mount_list = NULL;
+ while (device_list)
+ {
+ /* Add the mount entry. */
+ me = device_list->me;
+ me->me_next = mount_list;
+ mount_list = me;
+ /* Free devlist entry and advance. */
+ struct devlist *devlist = device_list->next;
+ free (device_list);
+ device_list = devlist;
+ }
+ }
+}
+
+/* Search a mount entry list for device id DEV.
+ Return the corresponding mount entry if found or NULL if not. */
+
+static struct mount_entry const * _GL_ATTRIBUTE_PURE
+me_for_dev (dev_t dev)
+{
+ struct devlist *dl = device_list;
+
+ while (dl)
{
- /* Add the mount entry. */
- me = devlist_head->me;
- me->me_next = mount_list;
- mount_list = me;
- /* Free devlist entry and advance. */
- struct devlist *devlist = devlist_head->next;
- free (devlist_head);
- devlist_head = devlist;
+ if (dl->dev_num == dev)
+ return dl->me;
+ dl = dl->next;
}
+
+ return NULL;
}
+
/* Return true if N is a known integer value. On many file systems,
UINTMAX_MAX represents an unknown value; on AIX, UINTMAX_MAX - 1
represents unknown. Use a rule that works on AIX file systems, and
@@ -856,6 +899,11 @@ get_dev (char const *disk, char const *mount_point, char const* file,
if (!selected_fstype (fstype) || excluded_fstype (fstype))
return;
+ /* Ignore relative MOUNT_POINTs, which are present for example
+ in /proc/mounts on Linux with network namespaces. */
+ if (!force_fsu && mount_point && ! IS_ABSOLUTE_FILE_NAME (mount_point))
+ return;
+
/* If MOUNT_POINT is NULL, then the file system is not mounted, and this
program reports on the file system that the special file is on.
It would be better to report on the unmounted file system,
@@ -868,9 +916,43 @@ get_dev (char const *disk, char const *mount_point, char const* file,
fsu = *force_fsu;
else if (get_fs_usage (stat_file, disk, &fsu))
{
- error (0, errno, "%s", quote (stat_file));
- exit_status = EXIT_FAILURE;
- return;
+ /* If we can't access a system provided entry due
+ to it not being present (now), or due to permissions,
+ just output placeholder values rather than failing. */
+ if (process_all && (errno == EACCES || errno == ENOENT))
+ {
+ if (! show_all_fs)
+ return;
+
+ fstype = "-";
+ fsu.fsu_blocksize = fsu.fsu_blocks = fsu.fsu_bfree =
+ fsu.fsu_bavail = fsu.fsu_files = fsu.fsu_ffree = UINTMAX_MAX;
+ }
+ else
+ {
+ error (0, errno, "%s", quote (stat_file));
+ exit_status = EXIT_FAILURE;
+ return;
+ }
+ }
+ else if (process_all && show_all_fs)
+ {
+ /* Ensure we don't output incorrect stats for over-mounted directories.
+ Discard stats when the device name doesn't match. Though don't
+ discard when used and current mount entries are both remote due
+ to the possibility of aliased host names or exports. */
+ struct stat sb;
+ if (stat (stat_file, &sb) == 0)
+ {
+ struct mount_entry const * dev_me = me_for_dev (sb.st_dev);
+ if (dev_me && ! STREQ (dev_me->me_devname, disk)
+ && (! dev_me->me_remote || ! me_remote))
+ {
+ fstype = "-";
+ fsu.fsu_blocksize = fsu.fsu_blocks = fsu.fsu_bfree =
+ fsu.fsu_bavail = fsu.fsu_files = fsu.fsu_ffree = UINTMAX_MAX;
+ }
+ }
}
if (fsu.fsu_blocks == 0 && !show_all_fs && !show_listed_fs)
@@ -1275,8 +1357,7 @@ get_all_entries (void)
{
struct mount_entry *me;
- if (!show_all_fs)
- filter_mount_list ();
+ filter_mount_list (show_all_fs);
for (me = mount_list; me; me = me->me_next)
get_dev (me->me_devname, me->me_mountdir, NULL, NULL, me->me_type,
@@ -1325,7 +1406,7 @@ or all file systems by default.\n\
emit_mandatory_arg_note ();
fputs (_("\
- -a, --all include dummy file systems\n\
+ -a, --all include pseudo, duplicate, inaccessible file systems\n\
-B, --block-size=SIZE scale sizes by SIZE before printing them; e.g.,\n\
'-BM' prints sizes in units of 1,048,576 bytes;\n\
see SIZE format below\n\
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
index 942d9a1..1df1eac 100644
--- a/doc/coreutils.texi
+++ b/doc/coreutils.texi
@@ -11123,11 +11123,15 @@ The program accepts the following options. Also see @ref{Common options}.
@itemx --all
@opindex -a
@opindex --all
-@cindex automounter file systems
@cindex ignore file systems
-Include in the listing dummy file systems, which
-are omitted by default. Such file systems are typically special-purpose
-pseudo-file-systems, such as automounter entries.
+Include in the listing dummy, duplicate, or inaccessible file systems, which
+are omitted by default. Dummy file systems are typically special purpose
+pseudo file systems such as @samp{/proc}, with no associated storage.
+Duplicate file systems are local or remote file systems that are mounted
+at separate locations in the local file hierarchy, or bind mounted locations.
+Inaccessible file systems are those which are mounted but subsequently
+over-mounted by another file system at that point, or otherwise inaccessible
+due to permissions of the mount point etc.
@item -B @var{size}
@itemx --block-size=@var{size}
diff --git a/tests/df/skip-duplicates.sh b/tests/df/skip-duplicates.sh
index 1e94dc0..4069604 100755
--- a/tests/df/skip-duplicates.sh
+++ b/tests/df/skip-duplicates.sh
@@ -2,7 +2,7 @@
# Test df's behavior when the mount list contains duplicate entries.
# This test is skipped on systems that lack LD_PRELOAD support; that's fine.
-# Copyright (C) 2012-2013 Free Software Foundation, Inc.
+# Copyright (C) 2012-2015 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -21,19 +21,73 @@
print_ver_ df
require_gcc_shared_
-df || skip_ "df fails"
+# We use --local here so as to not activate
+# potentially very many remote mounts.
+df --local || skip_ 'df fails'
-# Simulate an mtab file with two entries of the same device number.
-# Also add entries with unstatable mount dirs to ensure that's handled.
-cat > k.c <<'EOF' || framework_failure_
+export CU_NONROOT_FS=$(df --local --output=target 2>&1 | grep /. | head -n1)
+export CU_REMOTE_FS=$(df --local --output=target 2>&1 | grep /. |
+ tail -n+2 | head -n1)
+
+unique_entries=1
+test -z "$CU_NONROOT_FS" || unique_entries=$(expr $unique_entries + 1)
+test -z "$CU_REMOTE_FS" || unique_entries=$(expr $unique_entries + 2)
+
+grep '^#define HAVE_MNTENT_H 1' $CONFIG_HEADER > /dev/null \
+ || skip_ "no mntent.h available to confirm the interface"
+
+grep '^#define HAVE_GETMNTENT 1' $CONFIG_HEADER > /dev/null \
+ || skip_ "getmntent is not used on this system"
+
+# Simulate an mtab file to test various cases.
+cat > k.c <<EOF || framework_failure_
+#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
+#include <errno.h>
#include <mntent.h>
+#include <string.h>
+#include <dlfcn.h>
+
+#define STREQ(a, b) (strcmp (a, b) == 0)
+
+FILE* fopen(const char *path, const char *mode)
+{
+ static FILE* (*fopen_func)(char const *, char const *);
+
+ /* get reference to original (libc provided) fopen */
+ if (!fopen_func)
+ {
+ fopen_func = (FILE*(*)(char const *, char const *))
+ dlsym(RTLD_NEXT, "fopen");
+ if (!fopen_func)
+ {
+ fprintf (stderr, "Failed to find fopen()\n");
+ errno = ESRCH;
+ return NULL;
+ }
+ }
+
+ /* Returning ENOENT here will get read_file_system_list()
+ to fall back to using getmntent() below. */
+ if (STREQ (path, "/proc/self/mountinfo"))
+ {
+ errno = ENOENT;
+ return NULL;
+ }
+ else
+ return fopen_func(path, mode);
+}
+
+#define STREQ(a, b) (strcmp (a, b) == 0)
struct mntent *getmntent (FILE *fp)
{
+ static char *nonroot_fs;
+ static char *remote_fs;
+ static int done;
+
/* Prove that LD_PRELOAD works. */
- static int done = 0;
if (!done)
{
fclose (fopen ("x", "w"));
@@ -41,50 +95,92 @@ struct mntent *getmntent (FILE *fp)
}
static struct mntent mntents[] = {
- {.mnt_fsname="/short", .mnt_dir="/invalid/mount/dir"},
- {.mnt_fsname="fsname", .mnt_dir="/",},
- {.mnt_fsname="/fsname", .mnt_dir="/root"},
- {.mnt_fsname="/fsname", .mnt_dir="/"},
+ {.mnt_fsname="/short", .mnt_dir="/invalid/mount/dir", .mnt_opts=""},
+ {.mnt_fsname="fsname", .mnt_dir="/", .mnt_opts=""},
+ {.mnt_fsname="/fsname", .mnt_dir="/.", .mnt_opts=""},
+ {.mnt_fsname="/fsname", .mnt_dir="/", .mnt_opts=""},
+ {.mnt_fsname="virtfs", .mnt_dir="/NONROOT", .mnt_type="t1", .mnt_opts=""},
+ {.mnt_fsname="virtfs2", .mnt_dir="/NONROOT", .mnt_type="t2", .mnt_opts=""},
+ {.mnt_fsname="netns", .mnt_dir="net:[1234567]", .mnt_opts=""},
+ {.mnt_fsname="rem:ote1",.mnt_dir="/REMOTE", .mnt_opts=""},
+ {.mnt_fsname="rem:ote1",.mnt_dir="/REMOTE", .mnt_opts=""},
+ {.mnt_fsname="rem:ote2",.mnt_dir="/REMOTE", .mnt_opts=""},
};
- if (!getenv ("CU_TEST_DUPE_INVALID") && done == 1)
+ if (done == 1)
+ {
+ nonroot_fs = getenv ("CU_NONROOT_FS");
+ if (!nonroot_fs || !*nonroot_fs)
+ nonroot_fs = "/"; /* merge into / entries. */
+
+ remote_fs = getenv ("CU_REMOTE_FS");
+ }
+
+ if (done == 1 && !getenv ("CU_TEST_DUPE_INVALID"))
done++; /* skip the first entry. */
- while (done++ <= 4)
+ while (done++ <= 10)
{
- mntents[done-2].mnt_type = "-";
+ if (!mntents[done-2].mnt_type)
+ mntents[done-2].mnt_type = "-";
+ if (!mntents[done-2].mnt_opts)
+ mntents[done-2].mnt_opts = "-";
+ if (STREQ (mntents[done-2].mnt_dir, "/NONROOT"))
+ mntents[done-2].mnt_dir = nonroot_fs;
+ if (STREQ (mntents[done-2].mnt_dir, "/REMOTE"))
+ {
+ if (!remote_fs || !*remote_fs)
+ continue;
+ else
+ mntents[done-2].mnt_dir = remote_fs;
+ }
return &mntents[done-2];
}
+
return NULL;
}
EOF
# Then compile/link it:
-gcc --std=gnu99 -shared -fPIC -ldl -O2 k.c -o k.so \
+gcc_shared_ k.c k.so \
|| framework_failure_ 'failed to build shared library'
# Test if LD_PRELOAD works:
-LD_PRELOAD=./k.so df
+LD_PRELOAD=$LD_PRELOAD:./k.so df
test -f x || skip_ "internal test failure: maybe LD_PRELOAD doesn't work?"
# The fake mtab file should only contain entries
# having the same device number; thus the output should
-# consist of a header and one entry.
-LD_PRELOAD=./k.so df >out || fail=1
-test $(wc -l <out) -eq 2 || { fail=1; cat out; }
+# consist of a header and unique entries.
+LD_PRELOAD=$LD_PRELOAD:./k.so df -T >out || fail=1
+test $(wc -l <out) -eq $(expr 1 + $unique_entries) || { fail=1; cat out; }
-# Ensure we fail when unable to stat invalid entries
-LD_PRELOAD=./k.so CU_TEST_DUPE_INVALID=1 df >out && fail=1
-test $(wc -l <out) -eq 2 || { fail=1; cat out; }
+# With --total we should suppress the duplicate but separate remote file system
+LD_PRELOAD=$LD_PRELOAD:./k.so df --total >out || fail=1
+test "$CU_REMOTE_FS" && elide_remote=1 || elide_remote=0
+test $(wc -l <out) -eq $(expr 2 + $unique_entries - $elide_remote) ||
+ { fail=1; cat out; }
+
+# Ensure we don't fail when unable to stat (currently) unavailable entries
+LD_PRELOAD=$LD_PRELOAD:./k.so CU_TEST_DUPE_INVALID=1 df -T >out || fail=1
+test $(wc -l <out) -eq $(expr 1 + $unique_entries) || { fail=1; cat out; }
# df should also prefer "/fsname" over "fsname"
-test $(grep -c '/fsname' <out) -eq 1 || { fail=1; cat out; }
-# ... and "/fsname" with '/' as Mounted on over '/root'
-test $(grep -c '/root' <out) -eq 0 || { fail=1; cat out; }
+if test "$unique_entries" = 2; then
+ test $(grep -c '/fsname' <out) -eq 1 || { fail=1; cat out; }
+ # ... and "/fsname" with '/' as Mounted on over '/.'
+ test $(grep -cF '/.' <out) -eq 0 || { fail=1; cat out; }
+fi
+
+# df should use the last seen devname (mnt_fsname) and devtype (mnt_type)
+test $(grep -c 'virtfs2.*t2' <out) -eq 1 || { fail=1; cat out; }
# Ensure that filtering duplicates does not affect -a processing.
-LD_PRELOAD=./k.so df -a >out || fail=1
-test $(wc -l <out) -eq 4 || { fail=1; cat out; }
+LD_PRELOAD=$LD_PRELOAD:./k.so df -a >out || fail=1
+total_fs=6; test "$CU_REMOTE_FS" && total_fs=$(expr $total_fs + 3)
+test $(wc -l <out) -eq $total_fs || { fail=1; cat out; }
+# Ensure placeholder "-" values used for the eclipsed "virtfs"
+test $(grep -c 'virtfs *-' <out) -eq 1 || { fail=1; cat out; }
# Ensure that filtering duplicates does not affect
# argument processing (now without the fake getmntent()).
diff --git a/init.cfg b/init.cfg
index 360d4da..16f9813 100644
--- a/init.cfg
+++ b/init.cfg
@@ -472,6 +472,18 @@ require_sparse_support_()
fi
}
+# Compile a shared lib using the GCC options for doing so.
+# Pass input and output file as parameters respectively.
+# Any other optional parmeters are passed to $CC.
+gcc_shared_()
+{
+ local in=$1
+ local out=$2
+ shift 2 || return 1
+
+ $CC -Wall -shared --std=gnu99 -fPIC -O2 $* "$in" -o "$out" -ldl
+}
+
# There are a myriad of ways to build shared libs,
# so we only consider running tests requiring shared libs,
# on platforms that support building them as follows.

117
SOURCES/coreutils-8.22-df-getdisk.patch

@ -0,0 +1,117 @@
diff -urNp coreutils-8.22-orig/src/df.c coreutils-8.22/src/df.c
--- coreutils-8.22-orig/src/df.c 2015-07-03 15:51:44.293116375 +0200
+++ coreutils-8.22/src/df.c 2015-07-03 16:02:48.743390691 +0200
@@ -1057,6 +1057,33 @@ get_dev (char const *disk, char const *m
free (dev_name);
}
+/* Scan the mount list returning the _last_ device found for MOUNT.
+ NULL is returned if MOUNT not found. The result is malloced. */
+static char *
+last_device_for_mount (char const* mount)
+{
+ struct mount_entry const *me;
+ struct mount_entry const *le = NULL;
+
+ for (me = mount_list; me; me = me->me_next)
+ {
+ if (STREQ (me->me_mountdir, mount))
+ le = me;
+ }
+
+ if (le)
+ {
+ char *devname = le->me_devname;
+ char *canon_dev = canonicalize_file_name (devname);
+ if (canon_dev && IS_ABSOLUTE_FILE_NAME (canon_dev))
+ return canon_dev;
+ free (canon_dev);
+ return xstrdup (le->me_devname);
+ }
+ else
+ return NULL;
+}
+
/* If DISK corresponds to a mount point, show its usage
and return true. Otherwise, return false. */
static bool
@@ -1064,27 +1091,57 @@ get_disk (char const *disk)
{
struct mount_entry const *me;
struct mount_entry const *best_match = NULL;
+ bool best_match_accessible = false;
+ bool eclipsed_device = false;
char const *file = disk;
char *resolved = canonicalize_file_name (disk);
- if (resolved && resolved[0] == '/')
+ if (resolved && IS_ABSOLUTE_FILE_NAME (resolved))
disk = resolved;
size_t best_match_len = SIZE_MAX;
for (me = mount_list; me; me = me->me_next)
{
- if (STREQ (disk, me->me_devname))
+ /* TODO: Should cache canon_dev in the mount_entry struct. */
+ char *devname = me->me_devname;
+ char *canon_dev = canonicalize_file_name (me->me_devname);
+ if (canon_dev && IS_ABSOLUTE_FILE_NAME (canon_dev))
+ devname = canon_dev;
+
+ if (STREQ (disk, devname))
{
+ char *last_device = last_device_for_mount (me->me_mountdir);
+ eclipsed_device = last_device && ! STREQ (last_device, devname);
size_t len = strlen (me->me_mountdir);
- if (len < best_match_len)
+
+ if (! eclipsed_device
+ && (! best_match_accessible || len < best_match_len))
{
- best_match = me;
- if (len == 1) /* Traditional root. */
- break;
- else
- best_match_len = len;
+ struct stat disk_stats;
+ bool this_match_accessible = false;
+
+ if (stat (me->me_mountdir, &disk_stats) == 0)
+ best_match_accessible = this_match_accessible = true;
+
+ if (this_match_accessible
+ || (! best_match_accessible && len < best_match_len))
+ {
+ best_match = me;
+ if (len == 1) /* Traditional root. */
+ {
+ free (last_device);
+ free (canon_dev);
+ break;
+ }
+ else
+ best_match_len = len;
+ }
}
+
+ free (last_device);
}
+
+ free (canon_dev);
}
free (resolved);
@@ -1096,6 +1153,13 @@ get_disk (char const *disk)
best_match->me_remote, NULL, false);
return true;
}
+ else if (eclipsed_device)
+ {
+ error (0, 0, _("cannot access %s: over-mounted by another device"),
+ quote (file));
+ exit_status = EXIT_FAILURE;
+ return true;
+ }
return false;
}

72
SOURCES/coreutils-8.22-df-stat.patch

@ -0,0 +1,72 @@
From 9c4641f42bbecf63ec0a0e05caacbccd5332b831 Mon Sep 17 00:00:00 2001
From: Philipp Thomas <pth@suse.de>
Date: Sun, 26 Mar 2017 22:34:00 -0700
Subject: [PATCH 1/2] df: avoid querying excluded file systems

* src/df.c (filter_mount_list): Avoid stat() on
explicitly excluded file systems, which is especially
significant in cases like `-x nfs` which may hang.
* NEWS: Mention the bug fix.

Upstream-commit: 7c228bc55ed3fd6d56a6ad135438066de2f54a30
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
src/df.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/df.c b/src/df.c
index 5b9e8fd..e0ebed7 100644
--- a/src/df.c
+++ b/src/df.c
@@ -632,9 +632,11 @@ filter_mount_list (bool devices_only)
On Linux we probably have me_dev populated from /proc/self/mountinfo,
however we still stat() in case another device was mounted later. */
if ((me->me_remote && show_local_fs)
+ || (!selected_fstype (me->me_type) || excluded_fstype (me->me_type))
|| -1 == stat (me->me_mountdir, &buf))
{
- /* If remote, and showing just local, add ME for filtering later.
+ /* If remote, and showing just local, or FS type is excluded,
+ add ME for filtering later.
If stat failed; add ME to be able to complain about it later. */
buf.st_dev = me->me_dev;
}
--
2.13.6


From a4a61effe74766cdf047d6af52cf63613057bd87 Mon Sep 17 00:00:00 2001
From: Kamil Dudka <kdudka@redhat.com>
Date: Thu, 23 Nov 2017 17:30:09 +0100
Subject: [PATCH 2/2] df: limit the stat() call optimization for dummy file
systems only

Otherwise 'df -t rootfs' mistakenly shows a dummy file system without
using the -a option, because the dummy file system is shadowed by the
actual root file system entry, for which we optimize out the stat()
call.

The problem fixed by this patch is not observable on Fedora because
/proc/self/mountinfo (which we do not use on RHEL) does not contain
the rootfs mount entry.
---
src/df.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/df.c b/src/df.c
index adade6d..4c6131e 100644
--- a/src/df.c
+++ b/src/df.c
@@ -632,7 +632,8 @@ filter_mount_list (bool devices_only)
On Linux we probably have me_dev populated from /proc/self/mountinfo,
however we still stat() in case another device was mounted later. */
if ((me->me_remote && show_local_fs)
- || (!selected_fstype (me->me_type) || excluded_fstype (me->me_type))
+ || (me->me_dummy && (excluded_fstype (me->me_type)
+ || !selected_fstype (me->me_type)))
|| -1 == stat (me->me_mountdir, &buf))
{
/* If remote, and showing just local, or FS type is excluded,
--
2.13.6

157
SOURCES/coreutils-8.22-du-bindmountcycles.patch

@ -0,0 +1,157 @@
From dc1c0523a61932fb0c26a795b7e7391eadf2171a Mon Sep 17 00:00:00 2001
From: Boris Ranto <branto@redhat.com>
Date: Mon, 1 Dec 2014 09:24:14 +0100
Subject: [PATCH 1/1] du: handle sub-bind-mount cycles gracefully

This patch fixes the handling of sub-bind-mount cycles which are
incorrectly detected as the file system errors. If you bind mount the
directory 'a' to its subdirectory 'a/b/c' and then run 'du a/b' you
will get the circular dependency warning even though nothing is wrong
with the file system. This happens because the first directory that is
traversed twice in this case is not a bind mount but a child of bind
mount. The solution is to traverse all the directories in the cycle
that fts detected and check whether they are not a (bind) mount.

* src/du.c (mount_point_in_fts_cycle): New function that checks whether
any of the directories in the cycle that fts detected is a mount point.
* src/du.c (process_file): Update the function to use the new function
that looks up all the directories in the fts cycle instead of only the
last one.
* tests/du/bind-mount-dir-cycle-v2.sh: New test case that exhibits the
described behavior.
* tests/local.mk: Reference the new root test.
---
src/du.c | 23 ++++++++++++++++++++-
tests/du/bind-mount-dir-cycle-v2.sh | 38 +++++++++++++++++++++++++++++++++++
tests/local.mk | 1 +
3 files changed, 61 insertions(+), 1 deletions(-)
create mode 100755 tests/du/bind-mount-dir-cycle-v2.sh

diff --git a/src/du.c b/src/du.c
index ba20120..f5726c7 100644
--- a/src/du.c
+++ b/src/du.c
@@ -419,6 +419,27 @@ print_size (const struct duinfo *pdui, const char *string)
fflush (stdout);
}
+/* This function checks whether any of the directories in the cycle that
+ fts detected is a mount point. */
+
+static bool
+mount_point_in_fts_cycle (FTSENT const *ent)
+{
+ FTSENT const *cycle_ent = ent->fts_cycle;
+
+ while (ent && ent != cycle_ent)
+ {
+ if (di_set_lookup (di_mnt, ent->fts_statp->st_dev,
+ ent->fts_statp->st_ino) > 0)
+ {
+ return true;
+ }
+ ent = ent->fts_parent;
+ }
+
+ return false;
+}
+
/* This function is called once for every file system object that fts
encounters. fts does a depth-first traversal. This function knows
that and accumulates per-directory totals based on changes in
@@ -514,15 +514,11 @@ process_file (FTS *fts, FTSENT *ent)
break;
case FTS_DC:
- if (cycle_warning_required (fts, ent))
+ /* If not following symlinks and not a (bind) mount point. */
+ if (cycle_warning_required (fts, ent)
+ && ! mount_point_in_fts_cycle (ent))
{
- /* If this is a mount point, then diagnose it and avoid
- the cycle. */
- if (di_set_lookup (di_mnt, sb->st_dev, sb->st_ino))
- error (0, 0, _("mount point %s already traversed"),
- quote (file));
- else
- emit_cycle_warning (file);
+ emit_cycle_warning (file);
return false;
}
return true;
diff --git a/tests/du/bind-mount-dir-cycle-v2.sh b/tests/du/bind-mount-dir-cycle-v2.sh
new file mode 100755
index 0000000..08bfae2
--- /dev/null
+++ b/tests/du/bind-mount-dir-cycle-v2.sh
@@ -0,0 +1,38 @@
+#!/bin/sh
+# Check that du can handle sub-bind-mounts cycles as well.
+
+# Copyright (C) 2014 Free Software foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
+print_ver_ du
+require_root_
+
+cleanup_() { umount a/b/c; }
+
+mkdir -p a/b/c || framework_failure_
+mount --bind a a/b/c \
+ || skip_ 'This test requires mount with a working --bind option.'
+
+echo a/b/c > exp || framework_failure_
+echo a/b >> exp || framework_failure_
+
+du a/b > out 2> err || fail=1
+sed 's/^[0-9][0-9]* //' out > k && mv k out
+
+compare /dev/null err || fail=1
+compare exp out || fail=1
+
+Exit $fail
diff --git a/tests/local.mk b/tests/local.mk
index 653c984..349e322 100644
--- a/tests/local.mk
+++ b/tests/local.mk
@@ -117,6 +117,7 @@ all_root_tests = \
tests/dd/skip-seek-past-dev.sh \
tests/df/problematic-chars.sh \
tests/du/bind-mount-dir-cycle.sh \
+ tests/du/bind-mount-dir-cycle-v2.sh \
tests/id/setgid.sh \
tests/install/install-C-root.sh \
tests/ls/capability.sh \
--
1.7.2.5
diff -urNp coreutils-8.22-orig/tests/du/bind-mount-dir-cycle.sh coreutils-8.22/tests/du/bind-mount-dir-cycle.sh
--- coreutils-8.22-orig/tests/du/bind-mount-dir-cycle.sh 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/du/bind-mount-dir-cycle.sh 2015-07-02 15:58:49.230632316 +0200
@@ -27,12 +27,11 @@ mount --bind a a/b \
|| skip_ "This test requires mount with a working --bind option."
echo a > exp || framework_failure_
-echo "du: mount point 'a/b' already traversed" > exp-err || framework_failure_
-du a > out 2> err && fail=1
+du a > out 2> err || fail=1
sed 's/^[0-9][0-9]* //' out > k && mv k out
-compare exp-err err || fail=1
+compare /dev/null err || fail=1
compare exp out || fail=1
Exit $fail

32
SOURCES/coreutils-8.22-failingtests.patch

@ -0,0 +1,32 @@
diff -urNp coreutils-8.22-orig/tests/cp/cp-a-selinux.sh coreutils-8.22/tests/cp/cp-a-selinux.sh
--- coreutils-8.22-orig/tests/cp/cp-a-selinux.sh 2016-06-24 11:44:21.909303666 +0200
+++ coreutils-8.22/tests/cp/cp-a-selinux.sh 2016-06-24 11:47:28.473908346 +0200
@@ -73,7 +73,8 @@ old_type_d=$(get_selinux_type c_d)
# and get the adjusted type for comparison
cp -a c Z1 || fail=1
cp -a c_d Z1_d || fail=1
-if restorecon Z1 Z1_d 2>/dev/null; then
+if restorecon Z1 Z1_d 2>restorecon.err \
+ && compare /dev/null restorecon.err; then
new_type_f=$(get_selinux_type Z1)
new_type_d=$(get_selinux_type Z1_d)
diff -urNp coreutils-8.22-orig/tests/local.mk coreutils-8.22/tests/local.mk
--- coreutils-8.22-orig/tests/local.mk 2016-06-24 11:44:21.920303760 +0200
+++ coreutils-8.22/tests/local.mk 2016-06-24 11:49:31.388965563 +0200
@@ -117,7 +117,6 @@ all_root_tests = \
tests/df/problematic-chars.sh \
tests/du/bind-mount-dir-cycle.sh \
tests/du/bind-mount-dir-cycle-v2.sh \
- tests/id/setgid.sh \
tests/install/install-C-root.sh \
tests/ls/capability.sh \
tests/ls/nameless-uid.sh \
@@ -515,7 +514,6 @@ all_tests = \
tests/id/no-context.sh \
tests/id/context.sh \
tests/id/uid.sh \
- tests/id/setgid.sh \
tests/id/zero.sh \
tests/install/basic-1.sh \
tests/install/create-leading.sh \

39
SOURCES/coreutils-8.22-id-groups.patch

@ -0,0 +1,39 @@
diff -urNp coreutils-8.4-orig/src/id.c coreutils-8.4/src/id.c
--- coreutils-8.4-orig/src/id.c 2014-06-26 08:47:28.435047859 +0200
+++ coreutils-8.4/src/id.c 2014-06-26 08:55:28.352788022 +0200
@@ -296,8 +296,12 @@ print_full_info (const char *username)
gid_t *groups;
int i;
- int n_groups = xgetgroups (username, (pwd ? pwd->pw_gid : -1),
- &groups);
+ gid_t primary_group;
+ if (username)
+ primary_group = pwd ? pwd->pw_gid : -1;
+ else
+ primary_group = egid;
+ int n_groups = xgetgroups (username, primary_group, &groups);
if (n_groups < 0)
{
if (username)

diff -urNp coreutils-8.22-orig/tests/id/setgid.sh coreutils-8.22/tests/id/setgid.sh
--- coreutils-8.22-orig/tests/id/setgid.sh 2014-06-26 08:47:28.750053213 +0200
+++ coreutils-8.22/tests/id/setgid.sh 2014-06-26 08:51:02.536624404 +0200
@@ -1,5 +1,5 @@
#!/bin/sh
-# Verify that id -G prints the right group when run set-GID.
+# Verify that id [-G] prints the right group when run set-GID.
# Copyright (C) 2012-2013 Free Software Foundation, Inc.
@@ -35,4 +35,9 @@ setuidgid -g $gp1 $NON_ROOT_USERNAME env
compare exp out || fail=1
# With coreutils-8.16 and earlier, id -G would print both: $gp1 $g
+# With coreutils-8.22 and earlier, id would erroneously print groups=$g
+chroot --user=$NON_ROOT_USERNAME:$gp1 --groups='' / env PATH="$PATH" \
+ id > out || fail=1
+grep -F "groups=$gp1" out || fail=1
+
Exit $fail

236
SOURCES/coreutils-8.22-ls-interruption.patch

@ -0,0 +1,236 @@
From e56f09afdbd4bd920e4a1f3b03e29eaccd954dac Mon Sep 17 00:00:00 2001
From: Kamil Dudka <kdudka@redhat.com>
Date: Tue, 6 Sep 2016 17:38:26 +0200
Subject: [PATCH] ls: allow interruption when reading slow directories

Postpone installation of signal handlers until they're needed.
That is right before the first escape sequence is printed.

* src/ls.c (signal_setup): A new function refactored from main()
to set and restore signal handlers.
(main): Move signal handler setup to put_indicator()
so that the default signal handling is untouched as long as possible.
Adjusted condition for restoring signal handlers to reflect the change.
(put_indicator): Install signal handlers if called for the very first
time. It uses the same code that was in main() prior to this commit.
* NEWS: Mention the improvement.

See https://bugzilla.redhat.com/1365933
Fixes http://bugs.gnu.org/24232

Upstream-commit: 5445f7811ff945ea13aa2a0fd797eb4c0a0e4db0
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
src/ls.c | 161 ++++++++++++++++++++++++++++++++++++---------------------------
1 file changed, 93 insertions(+), 68 deletions(-)

diff --git a/src/ls.c b/src/ls.c
index a89c87a..1300938 100644
--- a/src/ls.c
+++ b/src/ls.c
@@ -1246,13 +1246,12 @@ process_signals (void)
}
}
-int
-main (int argc, char **argv)
-{
- int i;
- struct pending *thispend;
- int n_files;
+/* Setup signal handlers if INIT is true,
+ otherwise restore to the default. */
+static void
+signal_setup (bool init)
+{
/* The signals that are trapped, and the number of such signals. */
static int const sig[] =
{
@@ -1280,8 +1279,77 @@ main (int argc, char **argv)
enum { nsigs = ARRAY_CARDINALITY (sig) };
#if ! SA_NOCLDSTOP
- bool caught_sig[nsigs];
+ static bool caught_sig[nsigs];
+#endif
+
+ int j;
+
+ if (init)
+ {
+#if SA_NOCLDSTOP
+ struct sigaction act;
+
+ sigemptyset (&caught_signals);
+ for (j = 0; j < nsigs; j++)
+ {
+ sigaction (sig[j], NULL, &act);
+ if (act.sa_handler != SIG_IGN)
+ sigaddset (&caught_signals, sig[j]);
+ }
+
+ act.sa_mask = caught_signals;
+ act.sa_flags = SA_RESTART;
+
+ for (j = 0; j < nsigs; j++)
+ if (sigismember (&caught_signals, sig[j]))
+ {
+ act.sa_handler = sig[j] == SIGTSTP ? stophandler : sighandler;
+ sigaction (sig[j], &act, NULL);
+ }
+#else
+ for (j = 0; j < nsigs; j++)
+ {
+ caught_sig[j] = (signal (sig[j], SIG_IGN) != SIG_IGN);
+ if (caught_sig[j])
+ {
+ signal (sig[j], sig[j] == SIGTSTP ? stophandler : sighandler);
+ siginterrupt (sig[j], 0);
+ }
+ }
#endif
+ }
+ else /* restore. */
+ {
+#if SA_NOCLDSTOP
+ for (j = 0; j < nsigs; j++)
+ if (sigismember (&caught_signals, sig[j]))
+ signal (sig[j], SIG_DFL);
+#else
+ for (j = 0; j < nsigs; j++)
+ if (caught_sig[j])
+ signal (sig[j], SIG_DFL);
+#endif
+ }
+}
+
+static inline void
+signal_init (void)
+{
+ signal_setup (true);
+}
+
+static inline void
+signal_restore (void)
+{
+ signal_setup (false);
+}
+
+int
+main (int argc, char **argv)
+{
+ int i;
+ struct pending *thispend;
+ int n_files;
initialize_main (&argc, &argv);
set_program_name (argv[0]);
@@ -1317,46 +1385,6 @@ main (int argc, char **argv)
|| (is_colored (C_MISSING) && (format == long_format
|| format == security_format)))
check_symlink_color = true;
-
- /* If the standard output is a controlling terminal, watch out
- for signals, so that the colors can be restored to the
- default state if "ls" is suspended or interrupted. */
-
- if (0 <= tcgetpgrp (STDOUT_FILENO))
- {
- int j;
-#if SA_NOCLDSTOP
- struct sigaction act;
-
- sigemptyset (&caught_signals);
- for (j = 0; j < nsigs; j++)
- {
- sigaction (sig[j], NULL, &act);
- if (act.sa_handler != SIG_IGN)
- sigaddset (&caught_signals, sig[j]);
- }
-
- act.sa_mask = caught_signals;
- act.sa_flags = SA_RESTART;
-
- for (j = 0; j < nsigs; j++)
- if (sigismember (&caught_signals, sig[j]))
- {
- act.sa_handler = sig[j] == SIGTSTP ? stophandler : sighandler;
- sigaction (sig[j], &act, NULL);
- }
-#else
- for (j = 0; j < nsigs; j++)
- {
- caught_sig[j] = (signal (sig[j], SIG_IGN) != SIG_IGN);
- if (caught_sig[j])
- {
- signal (sig[j], sig[j] == SIGTSTP ? stophandler : sighandler);
- siginterrupt (sig[j], 0);
- }
- }
-#endif
- }
}
if (dereference == DEREF_UNDEFINED)
@@ -1467,32 +1495,21 @@ main (int argc, char **argv)
print_dir_name = true;
}
- if (print_with_color)
+ if (print_with_color && used_color)
{
int j;
- if (used_color)
- {
- /* Skip the restore when it would be a no-op, i.e.,
- when left is "\033[" and right is "m". */
- if (!(color_indicator[C_LEFT].len == 2
- && memcmp (color_indicator[C_LEFT].string, "\033[", 2) == 0
- && color_indicator[C_RIGHT].len == 1
- && color_indicator[C_RIGHT].string[0] == 'm'))
- restore_default_color ();
- }
+ /* Skip the restore when it would be a no-op, i.e.,
+ when left is "\033[" and right is "m". */
+ if (!(color_indicator[C_LEFT].len == 2
+ && memcmp (color_indicator[C_LEFT].string, "\033[", 2) == 0
+ && color_indicator[C_RIGHT].len == 1
+ && color_indicator[C_RIGHT].string[0] == 'm'))
+ restore_default_color ();
+
fflush (stdout);
- /* Restore the default signal handling. */
-#if SA_NOCLDSTOP
- for (j = 0; j < nsigs; j++)
- if (sigismember (&caught_signals, sig[j]))
- signal (sig[j], SIG_DFL);
-#else
- for (j = 0; j < nsigs; j++)
- if (caught_sig[j])
- signal (sig[j], SIG_DFL);
-#endif
+ signal_restore ();
/* Act on any signals that arrived before the default was restored.
This can process signals out of order, but there doesn't seem to
@@ -4512,6 +4529,14 @@ put_indicator (const struct bin_str *ind)
if (! used_color)
{
used_color = true;
+
+ /* If the standard output is a controlling terminal, watch out
+ for signals, so that the colors can be restored to the
+ default state if "ls" is suspended or interrupted. */
+
+ if (0 <= tcgetpgrp (STDOUT_FILENO))
+ signal_init ();
+
prep_non_filename_text ();
}
--
2.13.5

365
SOURCES/coreutils-8.22-mv-hardlinksrace.patch

@ -0,0 +1,365 @@
diff -urNp coreutils-8.22-orig/src/copy.c coreutils-8.22/src/copy.c
--- coreutils-8.22-orig/src/copy.c 2015-07-03 14:42:56.829772551 +0200
+++ coreutils-8.22/src/copy.c 2015-07-03 14:51:05.371383675 +0200
@@ -1292,20 +1292,12 @@ close_src_desc:
copy a regular file onto a symlink that points to it.
Try to minimize the cost of this function in the common case.
Set *RETURN_NOW if we've determined that the caller has no more
- work to do and should return successfully, right away.
-
- Set *UNLINK_SRC if we've determined that the caller wants to do
- 'rename (a, b)' where 'a' and 'b' are distinct hard links to the same
- file. In that case, the caller should try to unlink 'a' and then return
- successfully. Ideally, we wouldn't have to do that, and we'd be
- able to rely on rename to remove the source file. However, POSIX
- mistakenly requires that such a rename call do *nothing* and return
- successfully. */
+ work to do and should return successfully, right away. */
static bool
same_file_ok (char const *src_name, struct stat const *src_sb,
char const *dst_name, struct stat const *dst_sb,
- const struct cp_options *x, bool *return_now, bool *unlink_src)
+ const struct cp_options *x, bool *return_now)
{
const struct stat *src_sb_link;
const struct stat *dst_sb_link;
@@ -1316,7 +1308,6 @@ same_file_ok (char const *src_name, stru
bool same = SAME_INODE (*src_sb, *dst_sb);
*return_now = false;
- *unlink_src = false;
/* FIXME: this should (at the very least) be moved into the following
if-block. More likely, it should be removed, because it inhibits
@@ -1348,14 +1339,11 @@ same_file_ok (char const *src_name, stru
/* Here we have two symlinks that are hard-linked together,
and we're not making backups. In this unusual case, simply
returning true would lead to mv calling "rename(A,B)",
- which would do nothing and return 0. I.e., A would
- not be removed. Hence, the solution is to tell the
- caller that all it must do is unlink A and return. */
+ which would do nothing and return 0. */
if (same_link)
{
- *unlink_src = true;
*return_now = true;
- return true;
+ return ! x->move_mode;
}
}
@@ -1443,26 +1431,22 @@ same_file_ok (char const *src_name, stru
return true;
#endif
- /* They may refer to the same file if we're in move mode and the
- target is a symlink. That is ok, since we remove any existing
- destination file before opening it -- via 'rename' if they're on
- the same file system, via 'unlink (DST_NAME)' otherwise.
- It's also ok if they're distinct hard links to the same file. */
if (x->move_mode || x->unlink_dest_before_opening)
{
+ /* They may refer to the same file if we're in move mode and the
+ target is a symlink. That is ok, since we remove any existing
+ destination file before opening it -- via 'rename' if they're on
+ the same file system, via 'unlink (DST_NAME)' otherwise. */
if (S_ISLNK (dst_sb_link->st_mode))
return true;
+ /* It's not ok if they're distinct hard links to the same file as
+ this causes a race condition and we may lose data in this case. */
if (same_link
&& 1 < dst_sb_link->st_nlink
&& ! same_name (src_name, dst_name))
{
- if (x->move_mode)
- {
- *unlink_src = true;
- *return_now = true;
- }
- return true;
+ return ! x->move_mode;
}
}
@@ -1820,11 +1804,10 @@ copy_internal (char const *src_name, cha
{ /* Here, we know that dst_name exists, at least to the point
that it is stat'able or lstat'able. */
bool return_now;
- bool unlink_src;
have_dst_lstat = !use_stat;
if (! same_file_ok (src_name, &src_sb, dst_name, &dst_sb,
- x, &return_now, &unlink_src))
+ x, &return_now))
{
error (0, 0, _("%s and %s are the same file"),
quote_n (0, src_name), quote_n (1, dst_name));
@@ -1883,22 +1866,14 @@ copy_internal (char const *src_name, cha
cp and mv treat -i and -f differently. */
if (x->move_mode)
{
- if (abandon_move (x, dst_name, &dst_sb)
- || (unlink_src && unlink (src_name) == 0))
+ if (abandon_move (x, dst_name, &dst_sb))
{
/* Pretend the rename succeeded, so the caller (mv)
doesn't end up removing the source file. */
if (rename_succeeded)
*rename_succeeded = true;
- if (unlink_src && x->verbose)
- printf (_("removed %s\n"), quote (src_name));
return true;
}
- if (unlink_src)
- {
- error (0, errno, _("cannot remove %s"), quote (src_name));
- return false;
- }
}
else
{
diff -urNp coreutils-8.22-orig/tests/cp/same-file.sh coreutils-8.22/tests/cp/same-file.sh
--- coreutils-8.22-orig/tests/cp/same-file.sh 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/cp/same-file.sh 2015-07-03 14:54:12.539772880 +0200
@@ -36,7 +36,7 @@ ln dangling-slink hard-link > /dev/null 2>&1 \
rm -f no-such dangling-slink hard-link
test $hard_link_to_symlink_does_the_deref = yes \
- && remove_these_sed='/^0 -[bf]*l .*sl1 ->/d' \
+ && remove_these_sed='/^0 -[bf]*l .*sl1 ->/d; /hlsl/d' \
|| remove_these_sed='/^ELIDE NO TEST OUTPUT/d'
exec 3>&1 1> actual
@@ -44,7 +44,8 @@ exec 3>&1 1> actual
# FIXME: This should be bigger: like more than 8k
contents=XYZ
-for args in 'foo symlink' 'symlink foo' 'foo foo' 'sl1 sl2' 'foo hardlink'; do
+for args in 'foo symlink' 'symlink foo' 'foo foo' 'sl1 sl2' \
+ 'foo hardlink' 'hlsl sl2'; do
for options in '' -d -f -df --rem -b -bd -bf -bdf \
-l -dl -fl -dfl -bl -bdl -bfl -bdfl; do
case $args$options in
@@ -76,6 +77,8 @@ for args in 'foo symlink' 'symlink foo'
continue ;;
'yes:sl1 sl2:-bfl')
continue ;;
+ yes:hlsl*)
+ continue ;;
esac
rm -rf dir
@@ -86,6 +87,7 @@ for args in 'foo symlink' 'symlink foo'
case "$args" in *hardlink*) ln foo hardlink ;; esac
case "$args" in *sl1*) ln -s foo sl1;; esac
case "$args" in *sl2*) ln -s foo sl2;; esac
+ case "$args" in *hlsl*) ln sl2 hlsl;;esac
(
(
# echo 1>&2 cp $options $args
@@ -211,6 +213,24 @@ cat <<\EOF | sed "$remove_these_sed" > e
0 -bfl (foo hardlink)
0 -bdfl (foo hardlink)
+1 [cp: 'hlsl' and 'sl2' are the same file] (foo hlsl -> foo sl2 -> foo)
+0 -d (foo hlsl -> foo sl2 -> foo)
+1 -f [cp: 'hlsl' and 'sl2' are the same file] (foo hlsl -> foo sl2 -> foo)
+0 -df (foo hlsl -> foo sl2 -> foo)
+0 --rem (foo hlsl -> foo sl2)
+0 -b (foo hlsl -> foo sl2 sl2.~1~ -> foo)
+0 -bd (foo hlsl -> foo sl2 -> foo sl2.~1~ -> foo)
+0 -bf (foo hlsl -> foo sl2 sl2.~1~ -> foo)
+0 -bdf (foo hlsl -> foo sl2 -> foo sl2.~1~ -> foo)
+1 -l [cp: cannot create hard link 'sl2' to 'hlsl'] (foo hlsl -> foo sl2 -> foo)
+0 -dl (foo hlsl -> foo sl2 -> foo)
+0 -fl (foo hlsl -> foo sl2)
+0 -dfl (foo hlsl -> foo sl2 -> foo)
+0 -bl (foo hlsl -> foo sl2 sl2.~1~ -> foo)
+0 -bdl (foo hlsl -> foo sl2 -> foo)
+0 -bfl (foo hlsl -> foo sl2 sl2.~1~ -> foo)
+0 -bdfl (foo hlsl -> foo sl2 -> foo)
+
EOF
exec 1>&3 3>&-
diff -urNp coreutils-8.22-orig/tests/local.mk coreutils-8.22/tests/local.mk
--- coreutils-8.22-orig/tests/local.mk 2015-07-03 14:42:56.820772485 +0200
+++ coreutils-8.22/tests/local.mk 2015-07-03 14:55:07.060176869 +0200
@@ -591,7 +591,6 @@ all_tests = \
tests/mv/hard-3.sh \
tests/mv/hard-4.sh \
tests/mv/hard-link-1.sh \
- tests/mv/hard-verbose.sh \
tests/mv/i-1.pl \
tests/mv/i-2.sh \
tests/mv/i-3.sh \
diff -urNp coreutils-8.22-orig/tests/mv/force.sh coreutils-8.22/tests/mv/force.sh
--- coreutils-8.22-orig/tests/mv/force.sh 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/mv/force.sh 2015-07-03 14:56:42.840885931 +0200
@@ -25,18 +25,19 @@ ff2=mvforce2
echo force-contents > $ff || framework_failure_
ln $ff $ff2 || framework_failure_
-# This mv command should exit nonzero.
-mv $ff $ff > out 2>&1 && fail=1
+# mv should fail for the same name, or separate hardlinks as in
+# both cases rename() will do nothing and return success.
+# One could unlink(src) in the hardlink case, but that would
+# introduce races with overlapping mv instances removing both hardlinks.
-cat > exp <<EOF
-mv: '$ff' and '$ff' are the same file
-EOF
+for dest in $ff $ff2; do
+ # This mv command should exit nonzero.
+ mv $ff $dest > out 2>&1 && fail=1
-compare exp out || fail=1
-test $(cat $ff) = force-contents || fail=1
+ printf "mv: '$ff' and '$dest' are the same file\n" > exp
+ compare exp out || fail=1
-# This should succeed, even though the source and destination
-# device and inodes are the same.
-mv $ff $ff2 || fail=1
+ test $(cat $ff) = force-contents || fail=1
+done
Exit $fail
diff -urNp coreutils-8.22-orig/tests/mv/hard-4.sh coreutils-8.22/tests/mv/hard-4.sh
--- coreutils-8.22-orig/tests/mv/hard-4.sh 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/mv/hard-4.sh 2015-07-03 14:58:31.179687188 +0200
@@ -1,5 +1,5 @@
#!/bin/sh
-# ensure that mv removes a in this case: touch a; ln a b; mv a b
+# ensure that mv maintains a in this case: touch a; ln a b; mv a b
# Copyright (C) 2003-2013 Free Software Foundation, Inc.
@@ -21,15 +21,19 @@ print_ver_ mv
touch a || framework_failure_
ln a b || framework_failure_
+# Between coreutils-5.0 and coreutils-8.24, 'a' would be removed.
+# Before coreutils-5.0.1 the issue would not have been diagnosed.
+# We don't emulate the rename(a,b) with unlink(a) as that would
+# introduce races with overlapping mv instances removing both links.
+mv a b 2>err && fail=1
+printf "mv: 'a' and 'b' are the same file\n" > exp
+compare exp err || fail=1
-mv a b || fail=1
-# In coreutils-5.0 and earlier, a would not be removed.
-test -r a && fail=1
+test -r a || fail=1
test -r b || fail=1
-# Make sure it works also with --backup.
-ln b a
+# Make sure it works with --backup.
mv --backup=simple a b || fail=1
test -r a && fail=1
test -r b || fail=1
diff -urNp coreutils-8.22-orig/tests/mv/i-4.sh coreutils-8.22/tests/mv/i-4.sh
--- coreutils-8.22-orig/tests/mv/i-4.sh 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/mv/i-4.sh 2015-07-03 15:00:39.533718254 +0200
@@ -23,6 +23,7 @@ for i in a b; do
echo $i > $i || framework_failure_
done
echo y > y || framework_failure_
+echo n > n || framework_failure_
mv -i a b < y >/dev/null 2>&1 || fail=1
@@ -32,18 +33,15 @@ case "$(cat b)" in
*) fail=1 ;;
esac
-# Ensure that mv -i a b works properly with 'n' and 'y'
-# responses, even when a and b are hard links to the same file.
-# This 'n' test would fail (no prompt) for coreutils-5.0.1 through 5.3.0.
-echo n > n
+# Ensure that mv -i a b works properly with 'n' and 'y' responses,
+# when a and b are hard links to the same file.
rm -f a b
echo a > a
ln a b
-mv -i a b < n >/dev/null 2>&1 || fail=1
+mv -i a b < y 2>err && fail=1
test -r a || fail=1
test -r b || fail=1
-mv -i a b < y >/dev/null 2>&1 || fail=1
-test -r a && fail=1
-test -r b || fail=1
+printf "mv: 'a' and 'b' are the same file\n" > exp
+compare exp err || fail=1
Exit $fail
diff -urNp coreutils-8.22-orig/tests/mv/symlink-onto-hardlink-to-self.sh coreutils-8.22/tests/mv/symlink-onto-hardlink-to-self.sh
--- coreutils-8.22-orig/tests/mv/symlink-onto-hardlink-to-self.sh 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/mv/symlink-onto-hardlink-to-self.sh 2015-07-03 15:01:39.209190741 +0200
@@ -1,10 +1,10 @@
#!/bin/sh
-# Demonstrate that when moving a symlink onto a hardlink-to-that-symlink, the
-# source symlink is removed. Depending on your kernel (e.g., Linux, Solaris,
+# Demonstrate that when moving a symlink onto a hardlink-to-that-symlink,
+# an error is presented. Depending on your kernel (e.g., Linux, Solaris,
# but not NetBSD), prior to coreutils-8.16, the mv would successfully perform
# a no-op. I.e., surprisingly, mv s1 s2 would succeed, yet fail to remove s1.
-# Copyright (C) 2012-2013 Free Software Foundation, Inc.
+# Copyright (C) 2012-2014 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -26,27 +26,34 @@ print_ver_ mv
touch f || framework_failure_
ln -s f s2 || framework_failure_
-for opt in '' --backup; do
+# Attempt to create a hard link to that symlink.
+# On some systems, it's not possible: they create a hard link to the referent.
+ln s2 s1 || framework_failure_
+
+# If s1 is not a symlink, skip this test.
+test -h s1 \
+ || skip_ your kernel or file system cannot create a hard link to a symlink
- # Attempt to create a hard link to that symlink.
- # On some systems, it's not possible: they create a hard link to the referent.
- ln s2 s1 || framework_failure_
-
- # If s1 is not a symlink, skip this test.
- test -h s1 \
- || skip_ your kernel or file system cannot create a hard link to a symlink
+for opt in '' --backup; do
- mv $opt s1 s2 > out 2>&1 || fail=1
- compare /dev/null out || fail=1
+ if test "$opt" = --backup; then
+ mv $opt s1 s2 > out 2>&1 || fail=1
+ compare /dev/null out || fail=1
- # Ensure that s1 is gone.
- test -e s1 && fail=1
+ # Ensure that s1 is gone.
+ test -e s1 && fail=1
- if test "$opt" = --backup; then
# With --backup, ensure that the backup file was created.
ref=$(readlink s2~) || fail=1
test "$ref" = f || fail=1
else
+ echo "mv: 's1' and 's2' are the same file" > exp
+ mv $opt s1 s2 2>err && fail=1
+ compare exp err || fail=1
+
+ # Ensure that s1 is still present.
+ test -e s1 || fail=1
+
# Without --backup, ensure there is no backup file.
test -e s2~ && fail=1
fi

1017
SOURCES/coreutils-8.22-mv-n-noreplace.patch

File diff suppressed because it is too large Load Diff

171
SOURCES/coreutils-8.22-newfilesystems.patch

@ -0,0 +1,171 @@
diff -urNp coreutils-8.22-orig/src/fs-is-local.h coreutils-8.22/src/fs-is-local.h
--- coreutils-8.22-orig/src/fs-is-local.h 2016-06-24 10:59:08.545965484 +0200
+++ coreutils-8.22/src/fs-is-local.h 2016-06-24 11:08:47.435944633 +0200
@@ -6,6 +6,7 @@ is_local_fs_type (unsigned long int magi
{
switch (magic)
{
+ case S_MAGIC_ACFS: return 0;
case S_MAGIC_ADFS: return 1;
case S_MAGIC_AFFS: return 1;
case S_MAGIC_AFS: return 0;
@@ -15,13 +16,16 @@ is_local_fs_type (unsigned long int magi
case S_MAGIC_BEFS: return 1;
case S_MAGIC_BDEVFS: return 1;
case S_MAGIC_BFS: return 1;
+ case S_MAGIC_BPF_FS: return 1;
case S_MAGIC_BINFMTFS: return 1;
case S_MAGIC_BTRFS: return 1;
+ case S_MAGIC_BTRFS_TEST: return 1;
case S_MAGIC_CEPH: return 0;
case S_MAGIC_CGROUP: return 1;
case S_MAGIC_CIFS: return 0;
case S_MAGIC_CODA: return 0;
case S_MAGIC_COH: return 1;
+ case S_MAGIC_CONFIGFS: return 1;
case S_MAGIC_CRAMFS: return 1;
case S_MAGIC_CRAMFS_WEND: return 1;
case S_MAGIC_DEBUGFS: return 1;
@@ -43,10 +47,13 @@ is_local_fs_type (unsigned long int magi
case S_MAGIC_GFS: return 0;
case S_MAGIC_GPFS: return 0;
case S_MAGIC_HFS: return 1;
+ case S_MAGIC_HFS_PLUS: return 1;
+ case S_MAGIC_HFS_X: return 1;
case S_MAGIC_HOSTFS: return 1;
case S_MAGIC_HPFS: return 1;
case S_MAGIC_HUGETLBFS: return 1;
case S_MAGIC_MTD_INODE_FS: return 1;
+ case S_MAGIC_IBRIX: return 0;
case S_MAGIC_INOTIFYFS: return 1;
case S_MAGIC_ISOFS: return 1;
case S_MAGIC_ISOFS_R_WIN: return 1;
@@ -55,7 +62,9 @@ is_local_fs_type (unsigned long int magi
case S_MAGIC_JFFS2: return 1;
case S_MAGIC_JFS: return 1;
case S_MAGIC_KAFS: return 0;
+ case S_MAGIC_LOGFS: return 1;
case S_MAGIC_LUSTRE: return 0;
+ case S_MAGIC_M1FS: return 1;
case S_MAGIC_MINIX: return 1;
case S_MAGIC_MINIX_30: return 1;
case S_MAGIC_MINIX_V2: return 1;
@@ -67,11 +75,14 @@ is_local_fs_type (unsigned long int magi
case S_MAGIC_NFS: return 0;
case S_MAGIC_NFSD: return 0;
case S_MAGIC_NILFS: return 1;
+ case S_MAGIC_NSFS: return 1;
case S_MAGIC_NTFS: return 1;
case S_MAGIC_OPENPROM: return 1;
case S_MAGIC_OCFS2: return 0;
+ case S_MAGIC_OVERLAYFS: return 0;
case S_MAGIC_PANFS: return 0;
case S_MAGIC_PIPEFS: return 0;
+ case S_MAGIC_PRL_FS: return 0;
case S_MAGIC_PROC: return 1;
case S_MAGIC_PSTOREFS: return 1;
case S_MAGIC_QNX4: return 1;
@@ -91,6 +101,7 @@ is_local_fs_type (unsigned long int magi
case S_MAGIC_SYSV2: return 1;
case S_MAGIC_SYSV4: return 1;
case S_MAGIC_TMPFS: return 1;
+ case S_MAGIC_TRACEFS: return 1;
case S_MAGIC_UBIFS: return 1;
case S_MAGIC_UDF: return 1;
case S_MAGIC_UFS: return 1;
diff -urNp coreutils-8.22-orig/src/stat.c coreutils-8.22/src/stat.c
--- coreutils-8.22-orig/src/stat.c 2013-12-13 15:12:46.000000000 +0100
+++ coreutils-8.22/src/stat.c 2016-06-24 11:16:37.853990792 +0200
@@ -311,13 +311,13 @@ human_fstype (STRUCT_STATVFS const *stat
return "fusectl";
case S_MAGIC_FUTEXFS: /* 0x0BAD1DEA local */
return "futexfs";
- case S_MAGIC_GFS: /* 0x1161970 remote */
+ case S_MAGIC_GFS: /* 0x01161970 remote */
return "gfs/gfs2";
case S_MAGIC_GPFS: /* 0x47504653 remote */
return "gpfs";
case S_MAGIC_HFS: /* 0x4244 local */
return "hfs";
- case S_MAGIC_HOSTFS: /* 0xC0FFEE local */
+ case S_MAGIC_HOSTFS: /* 0x00C0FFEE local */
return "hostfs";
case S_MAGIC_HPFS: /* 0xF995E849 local */
return "hpfs";
@@ -369,7 +369,7 @@ human_fstype (STRUCT_STATVFS const *stat
return "ntfs";
case S_MAGIC_OPENPROM: /* 0x9FA1 local */
return "openprom";
- case S_MAGIC_OCFS2: /* 0x7461636f remote */
+ case S_MAGIC_OCFS2: /* 0x7461636F remote */
return "ocfs2";
case S_MAGIC_PANFS: /* 0xAAD7AAEA remote */
return "panfs";
@@ -430,7 +430,9 @@ human_fstype (STRUCT_STATVFS const *stat
return "v9fs";
case S_MAGIC_VMHGFS: /* 0xBACBACBC remote */
return "vmhgfs";
- case S_MAGIC_VXFS: /* 0xA501FCF5 local */
+ case S_MAGIC_VXFS: /* 0xA501FCF5 remote */
+ /* Veritas File System can run in single instance or clustered mode,
+ so mark as remote to cater for the latter case. */
return "vxfs";
case S_MAGIC_VZFS: /* 0x565A4653 local */
return "vzfs";
@@ -444,6 +446,37 @@ human_fstype (STRUCT_STATVFS const *stat
return "xia";
case S_MAGIC_ZFS: /* 0x2FC12FC1 local */
return "zfs";
+/* Refresh from coreutils-8.25 bellow */
+ case S_MAGIC_ACFS: /* 0x61636673 remote */
+ return "acfs";
+ case S_MAGIC_BPF_FS: /* 0xCAFE4A11 local */
+ return "bpf_fs";
+ case S_MAGIC_BTRFS_TEST: /* 0x73727279 local */
+ return "btrfs_test";
+ case S_MAGIC_CONFIGFS: /* 0x62656570 local */
+ return "configfs";
+ case S_MAGIC_HFS_PLUS: /* 0x482B local */
+ return "hfs+";
+ case S_MAGIC_HFS_X: /* 0x4858 local */
+ return "hfsx";
+ case S_MAGIC_IBRIX: /* 0x013111A8 remote */
+ return "ibrix";
+ case S_MAGIC_LOGFS: /* 0xC97E8168 local */
+ return "logfs";
+ case S_MAGIC_M1FS: /* 0x5346314D local */
+ return "m1fs";
+ case S_MAGIC_NSFS: /* 0x6E736673 local */
+ return "nsfs";
+ case S_MAGIC_OVERLAYFS: /* 0x794C7630 remote */
+ /* This may overlay remote file systems.
+ Also there have been issues reported with inotify and overlayfs,
+ so mark as "remote" so that polling is used. */
+ return "overlayfs";
+ case S_MAGIC_PRL_FS: /* 0x7C7C6673 remote */
+ return "prl_fs";
+ case S_MAGIC_TRACEFS: /* 0x74726163 local */
+ return "tracefs";
+
# elif __GNU__
case FSTYPE_UFS:
diff -urNp coreutils-8.22-orig/src/tail.c coreutils-8.22/src/tail.c
--- coreutils-8.22-orig/src/tail.c 2013-12-09 14:40:46.000000000 +0100
+++ coreutils-8.22/src/tail.c 2016-06-24 11:03:10.268044584 +0200
@@ -898,13 +898,15 @@ fremote (int fd, const char *name)
case 0:
break;
case -1:
+#if 0
{
unsigned long int fs_type = buf.f_type;
error (0, 0, _("unrecognized file system type 0x%08lx for %s. "
"please report this to %s. reverting to polling"),
fs_type, quote (name), PACKAGE_BUGREPORT);
/* Treat as "remote", so caller polls. */
}
+#endif
break;
case 1:
remote = false;

267
SOURCES/coreutils-8.22-non-defaulttests.patch

@ -0,0 +1,267 @@
diff -urNp coreutils-8.22-orig/tests/cp/cp-a-selinux.sh coreutils-8.22/tests/cp/cp-a-selinux.sh
--- coreutils-8.22-orig/tests/cp/cp-a-selinux.sh 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/cp/cp-a-selinux.sh 2015-08-17 13:59:27.837012142 +0200
@@ -4,7 +4,7 @@
# Check also locally if --preserve=context, -a and --preserve=all
# does work
-# Copyright (C) 2007-2013 Free Software Foundation, Inc.
+# Copyright (C) 2007-2015 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -37,16 +37,36 @@ cp -a c d 2>err || framework_failure_
cp --preserve=context c e || framework_failure_
cp --preserve=all c f || framework_failure_
ls -Z d | grep $ctx || fail=1
-test -s err && fail=1 #there must be no stderr output for -a
+# there must be no stderr output for -a
+compare /dev/null err || fail=1
ls -Z e | grep $ctx || fail=1
ls -Z f | grep $ctx || fail=1
+rm -f f
+
+# Check handling of existing dirs which requires specific handling
+# due to recursion, and was handled incorrectly in coreutils-8.22
+# Note standard permissions are updated for existing directories
+# in the destination, so SELinux contexts should be updated too.
+chmod o+rw restore/existing_dir
+mkdir -p backup/existing_dir/ || framework_failure_
+ls -Zd backup/existing_dir > ed_ctx || fail=1
+grep $ctx ed_ctx && framework_failure_
+touch backup/existing_dir/file || framework_failure_
+chcon $ctx backup/existing_dir/file || framework_failure_
+# Set the dir context to ensure it is reset
+mkdir -p --context="$ctx" restore/existing_dir || framework_failure_
+# Copy and ensure existing directories updated
+cp -a backup/. restore/
+ls -Zd restore/existing_dir > ed_ctx || fail=1
+grep $ctx ed_ctx &&
+ { ls -lZd restore/existing_dir; fail=1; }
# Check restorecon (-Z) functionality for file and directory
get_selinux_type() { ls -Zd "$1" | sed -n 's/.*:\(.*_t\):.*/\1/p'; }
# Also make a dir with our known context
mkdir c_d || framework_failure_
chcon $ctx c_d || framework_failure_
-# Get the type of this known context for file and dir
+# Get the type of this known context for file and dir for tracing
old_type_f=$(get_selinux_type c)
old_type_d=$(get_selinux_type c_d)
# Setup copies for manipulation with restorecon
@@ -62,7 +82,7 @@ if restorecon Z1 Z1_d 2>/dev/null; then
cpZ_type_f=$(get_selinux_type Z2)
test "$cpZ_type_f" = "$new_type_f" || fail=1
- # Ensuze -Z overrides -a and that dirs are handled too
+ # Ensure -Z overrides -a and that dirs are handled too
cp -aZ c Z3 || fail=1
cp -aZ c_d Z3_d || fail=1
cpaZ_type_f=$(get_selinux_type Z3)
@@ -93,27 +113,30 @@ test $skip = 1 \
cd mnt || framework_failure_
-echo > f || framework_failure_
-
+# Create files with hopefully different contexts
+echo > ../f || framework_failure_
echo > g || framework_failure_
+test "$(stat -c%C ../f)" = "$(stat -c%C g)" &&
+ skip_ "files on separate file systems have the same security context"
+
# /bin/cp from coreutils-6.7-3.fc7 would fail this test by letting cp
# succeed (giving no diagnostics), yet leaving the destination file empty.
-cp -a f g 2>err || fail=1
+cp -a ../f g 2>err || fail=1
test -s g || fail=1 # The destination file must not be empty.
-test -s err && fail=1 # There must be no stderr output.
+compare /dev/null err || fail=1
# =====================================================
# Here, we expect cp to succeed and not warn with "Operation not supported"
rm -f g
echo > g
-cp --preserve=all f g 2>err || fail=1
+cp --preserve=all ../f g 2>err || fail=1
test -s g || fail=1
grep "Operation not supported" err && fail=1
# =====================================================
# The same as above except destination does not exist
rm -f g
-cp --preserve=all f g 2>err || fail=1
+cp --preserve=all ../f g 2>err || fail=1
test -s g || fail=1
grep "Operation not supported" err && fail=1
@@ -133,9 +156,9 @@ echo > g
# =====================================================
# Here, we expect cp to fail, because it cannot set the SELinux
# security context through NFS or a mount with fixed context.
-cp --preserve=context f g 2> out && fail=1
+cp --preserve=context ../f g 2> out && fail=1
# Here, we *do* expect the destination to be empty.
-test -s g && fail=1
+compare /dev/null g || fail=1
sed "s/ .g'.*//" out > k
mv k out
compare exp out || fail=1
@@ -143,9 +166,9 @@ compare exp out || fail=1
rm -f g
echo > g
# Check if -a option doesn't silence --preserve=context option diagnostics
-cp -a --preserve=context f g 2> out2 && fail=1
+cp -a --preserve=context ../f g 2> out2 && fail=1
# Here, we *do* expect the destination to be empty.
-test -s g && fail=1
+compare /dev/null g || fail=1
sed "s/ .g'.*//" out2 > k
mv k out2
compare exp out2 || fail=1
@@ -154,31 +177,33 @@ for no_g_cmd in '' 'rm -f g'; do
# restorecon equivalent. Note even though the context
# returned from matchpathcon() will not match $ctx
# the resulting ENOTSUP warning will be suppressed.
+
# With absolute path
$no_g_cmd
- cp -Z f $(realpath g) || fail=1
+ cp -Z ../f $(realpath g) || fail=1
# With relative path
$no_g_cmd
- cp -Z f g || fail=1
+ cp -Z ../f g || fail=1
# -Z overrides -a
$no_g_cmd
- cp -Z -a f g || fail=1
+ cp -Z -a ../f g || fail=1
# -Z doesn't take an arg
$no_g_cmd
- cp -Z "$ctx" f g && fail=1
+ returns_ 1 cp -Z "$ctx" ../f g || fail=1
# Explicit context
$no_g_cmd
# Explicitly defaulting to the global $ctx should work
- cp --context="$ctx" f g || fail=1
+ cp --context="$ctx" ../f g || fail=1
# --context overrides -a
$no_g_cmd
- cp -a --context="$ctx" f g || fail=1
+ cp -a --context="$ctx" ../f g || fail=1
done
-# Mutually exlusive options
-cp -Z --preserve=context f g && fail=1
-cp --preserve=context -Z f g && fail=1
-cp --preserve=context --context="$ctx" f g && fail=1
+# Mutually exclusive options
+returns_ 1 cp -Z --preserve=context ../f g || fail=1
+returns_ 1 cp --preserve=context -Z ../f g || fail=1
+returns_ 1 cp --preserve=context --context="$ctx" ../f g || fail=1
Exit $fail
+
diff -urNp coreutils-8.22-orig/tests/du/2g.sh coreutils-8.22/tests/du/2g.sh
--- coreutils-8.22-orig/tests/du/2g.sh 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/du/2g.sh 2015-08-17 13:59:37.349088611 +0200
@@ -3,7 +3,7 @@
# Before coreutils-5.93, on systems with a signed, 32-bit stat.st_blocks
# one of du's computations would overflow.
-# Copyright (C) 2005-2013 Free Software Foundation, Inc.
+# Copyright (C) 2005-2015 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -24,13 +24,9 @@ print_ver_ du
# Creating a 2GB file counts as 'very expensive'.
very_expensive_
-
# Get number of free kilobytes on current partition, so we can
# skip this test if there is insufficient free space.
-
-# This technique relies on the fact that the 'Available' kilobyte
-# count is the number just before the one with a trailing '%'.
-free_kb=$(df -kP .|tail -1|sed 's/ [0-9][0-9]*%.*//;s/ *$//;s/.* //')
+free_kb=$(df -k --output=avail . | tail -n1)
case "$free_kb" in
[0-9]*) ;;
*) skip_ "invalid size from df: $free_kb";;
@@ -45,16 +41,22 @@ test $min_kb -lt $free_kb ||
}
big=big
-rm -f $big
-test -t 1 || printf 'creating a 2GB file...\n'
-for i in $(seq 100); do
- # Note: 2147483648 == 2^31. Print floor(2^31/100) per iteration.
- printf %21474836s x >> $big || fail=1
- # On the final iteration, append the remaining 48 bytes.
- test $i = 100 && { printf %48s x >> $big || fail=1; }
- test -t 1 && printf 'creating a 2GB file: %d%% complete\r' $i
-done
-echo
+
+if ! fallocate -l2G $big; then
+ rm -f $big
+ {
+ is_local_dir_ . || skip 'Not writing 2GB data to remote'
+ for i in $(seq 100); do
+ # Note: 2147483648 == 2^31. Print floor(2^31/100) per iteration.
+ printf %21474836s x || fail=1
+ done
+ # After the final iteration, append the remaining 48 bytes.
+ printf %48s x || fail=1
+ } > $big || fail=1
+fi
+
+# The allocation may be done asynchronously (BTRFS for example)
+sync $big || framework_failure_
du -k $big > out1 || fail=1
rm -f $big
diff -urNp coreutils-8.22-orig/tests/init.sh coreutils-8.22/tests/init.sh
--- coreutils-8.22-orig/tests/init.sh 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/init.sh 2015-08-17 13:59:19.900948318 +0200
@@ -93,6 +93,27 @@ skip_ () { warn_ "$ME_: skipped test: $@
fatal_ () { warn_ "$ME_: hard error: $@"; Exit 99; }
framework_failure_ () { warn_ "$ME_: set-up failure: $@"; Exit 99; }
+# This is used to simplify checking of the return value
+# which is useful when ensuring a command fails as desired.
+# I.e., just doing `command ... &&fail=1` will not catch
+# a segfault in command for example. With this helper you
+# instead check an explicit exit code like
+# returns_ 1 command ... || fail
+returns_ () {
+ # Disable tracing so it doesn't interfere with stderr of the wrapped command
+ { set +x; } 2>/dev/null
+
+ local exp_exit="$1"
+ shift
+ "$@"
+ test $? -eq $exp_exit && ret_=0 || ret_=1
+
+ if test "$VERBOSE" = yes && test "$gl_set_x_corrupts_stderr_" = false; then
+ set -x
+ fi
+ { return $ret_; } 2>/dev/null
+}
+
# Sanitize this shell to POSIX mode, if possible.
DUALCASE=1; export DUALCASE
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
diff -urNp coreutils-8.22-orig/tests/local.mk coreutils-8.22/tests/local.mk
--- coreutils-8.22-orig/tests/local.mk 2015-08-17 12:44:49.343344148 +0200
+++ coreutils-8.22/tests/local.mk 2015-08-17 13:59:12.124885835 +0200
@@ -121,7 +121,6 @@ all_root_tests = \
tests/install/install-C-root.sh \
tests/ls/capability.sh \
tests/ls/nameless-uid.sh \
- tests/misc/chcon.sh \
tests/misc/chroot-credentials.sh \
tests/misc/selinux.sh \
tests/misc/truncate-owned-by-other.sh \

39
SOURCES/coreutils-8.22-ppc64le.patch

@ -0,0 +1,39 @@
diff -up coreutils-8.22/gnulib-tests/test-isnanl.h.ppc coreutils-8.22/gnulib-tests/test-isnanl.h
--- coreutils-8.22/gnulib-tests/test-isnanl.h.ppc 2014-06-23 14:01:05.925541920 +0200
+++ coreutils-8.22/gnulib-tests/test-isnanl.h 2014-06-23 14:01:39.437617584 +0200
@@ -51,6 +51,15 @@ main ()
/* A bit pattern that is different from a Quiet NaN. With a bit of luck,
it's a Signalling NaN. */
{
+#if defined __powerpc__ && LDBL_MANT_DIG == 106
+ /* This is PowerPC "double double", a pair of two doubles. Inf and Nan are
+ represented as the corresponding 64-bit IEEE values in the first double;
+ the second is ignored. Manipulate only the first double. */
+ #undef NWORDS
+ #define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+#endif
+
memory_long_double m;
m.value = NaNl ();
# if LDBL_EXPBIT0_BIT > 0
diff -up coreutils-8.22/gnulib-tests/test-signbit.c.ppc coreutils-8.22/gnulib-tests/test-signbit.c
--- coreutils-8.22/gnulib-tests/test-signbit.c.ppc 2013-12-04 15:53:33.000000000 +0100
+++ coreutils-8.22/gnulib-tests/test-signbit.c 2014-06-23 13:59:20.378307385 +0200
@@ -151,6 +151,16 @@ test_signbitl ()
#define NWORDS \
((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
typedef union { long double value; unsigned int word[NWORDS]; } memory_long_double;
+
+#if defined __powerpc__ && LDBL_MANT_DIG == 106
+ /* This is PowerPC "double double", a pair of two doubles. Inf and Nan are
+ represented as the corresponding 64-bit IEEE values in the first double;
+ the second is ignored. Manipulate only the first double. */
+ #undef NWORDS
+ #define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+#endif
+
memory_long_double m;
m.value = zerol / zerol;
# if LDBL_EXPBIT0_BIT > 0

80
SOURCES/coreutils-8.22-selinux-optionsseparate.patch

@ -0,0 +1,80 @@
diff -urNp coreutils-8.22-orig/src/cp.c coreutils-8.22/src/cp.c
--- coreutils-8.22-orig/src/cp.c 2015-06-11 15:58:04.230858212 +0200
+++ coreutils-8.22/src/cp.c 2015-06-11 15:59:13.191396755 +0200
@@ -233,8 +233,10 @@ Copy SOURCE to DEST, or multiple SOURCE(
-x, --one-file-system stay on this file system\n\
"), stdout);
fputs (_("\
- -Z, --context[=CTX] set SELinux security context of destination\n\
- file to default type, or to CTX if specified\n\
+ -Z set SELinux security context of destination\n\
+ file to default type\n\
+ --context[=CTX] like -Z, or if CTX is specified then set the\n\
+ SELinux or SMACK security context to CTX\n\
"), stdout);
fputs (HELP_OPTION_DESCRIPTION, stdout);
fputs (VERSION_OPTION_DESCRIPTION, stdout);
diff -urNp coreutils-8.22-orig/src/install.c coreutils-8.22/src/install.c
--- coreutils-8.22-orig/src/install.c 2015-06-11 15:58:04.230858212 +0200
+++ coreutils-8.22/src/install.c 2015-06-11 16:00:16.754893027 +0200
@@ -647,8 +647,10 @@ In the 4th form, create all components o
"), stdout);
fputs (_("\
-P, --preserve-context preserve SELinux security context (-P deprecated)\n\
- -Z, --context[=CTX] set SELinux security context of destination file to\n\
- default type, or to CTX if specified\n\
+ -Z set SELinux security context of destination\n\
+ file to default type\n\
+ --context[=CTX] like -Z, or if CTX is specified then set the\n\
+ SELinux or SMACK security context to CTX\n\
"), stdout);
fputs (HELP_OPTION_DESCRIPTION, stdout);
diff -urNp coreutils-8.22-orig/src/mkdir.c coreutils-8.22/src/mkdir.c
--- coreutils-8.22-orig/src/mkdir.c 2013-12-05 01:59:36.000000000 +0100
+++ coreutils-8.22/src/mkdir.c 2015-06-11 16:01:17.209364915 +0200
@@ -66,8 +66,12 @@ Create the DIRECTORY(ies), if they do no
-m, --mode=MODE set file mode (as in chmod), not a=rwx - umask\n\
-p, --parents no error if existing, make parent directories as needed\n\
-v, --verbose print a message for each created directory\n\
- -Z, --context[=CTX] set the SELinux security context of each created\n\
- directory to default type or to CTX if specified\n\
+"), stdout);
+ fputs (_("\
+ -Z set SELinux security context of each created directory\n\
+ to the default type\n\
+ --context[=CTX] like -Z, or if CTX is specified then set the SELinux\n\
+ or SMACK security context to CTX\n\
"), stdout);
fputs (HELP_OPTION_DESCRIPTION, stdout);
fputs (VERSION_OPTION_DESCRIPTION, stdout);
diff -urNp coreutils-8.22-orig/src/mkfifo.c coreutils-8.22/src/mkfifo.c
--- coreutils-8.22-orig/src/mkfifo.c 2013-12-05 00:43:05.000000000 +0100
+++ coreutils-8.22/src/mkfifo.c 2015-06-11 16:02:03.389725315 +0200
@@ -61,8 +61,9 @@ Create named pipes (FIFOs) with the give
-m, --mode=MODE set file permission bits to MODE, not a=rw - umask\n\
"), stdout);
fputs (_("\
- -Z, --context[=CTX] set the SELinux security context of each NAME to\n\
- default type, or CTX if specified\n\
+ -Z set the SELinux security context to default type\n\
+ --context[=CTX] like -Z, or if CTX is specified then set the SELinux\n\
+ or SMACK security context to CTX\n\
"), stdout);
fputs (HELP_OPTION_DESCRIPTION, stdout);
fputs (VERSION_OPTION_DESCRIPTION, stdout);
diff -urNp coreutils-8.22-orig/src/mknod.c coreutils-8.22/src/mknod.c
--- coreutils-8.22-orig/src/mknod.c 2013-12-05 00:43:05.000000000 +0100
+++ coreutils-8.22/src/mknod.c 2015-06-11 16:02:36.300982160 +0200
@@ -63,8 +63,9 @@ Create the special file NAME of the give
-m, --mode=MODE set file permission bits to MODE, not a=rw - umask\n\
"), stdout);
fputs (_("\
- -Z, --context[=CTX] set the SELinux security context of NAME to\n\
- default type, or to CTX if specified\n\
+ -Z set the SELinux security context to default type\n\
+ --context[=CTX] like -Z, or if CTX is specified then set the SELinux\n\
+ or SMACK security context to CTX\n\
"), stdout);
fputs (HELP_OPTION_DESCRIPTION, stdout);
fputs (VERSION_OPTION_DESCRIPTION, stdout);

35
SOURCES/coreutils-8.22-sort-blanks.patch

@ -0,0 +1,35 @@
From 3976ef5a20369d8b490907ab2cba2d617305a5e0 Mon Sep 17 00:00:00 2001
From: Kamil Dudka <kdudka@redhat.com>
Date: Mon, 30 May 2016 16:19:20 +0200
Subject: [PATCH] sort: do not use static array 'blanks' in human_numcompare()

... because the array is not initialized with MB locales. Note this is
rather a conservative fix. I plan to do more cleanup of the i18n patch
in Fedora to prevent mistakes like this in future updates of coreutils.
---
src/sort.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/src/sort.c b/src/sort.c
index 9e07ad8..e47b039 100644
--- a/src/sort.c
+++ b/src/sort.c
@@ -2275,12 +2275,10 @@ find_unit_order (char const *number)
<none/unknown> < K/k < M < G < T < P < E < Z < Y */
static int
-human_numcompare (char const *a, char const *b)
+human_numcompare (char *a, char *b)
{
- while (blanks[to_uchar (*a)])
- a++;
- while (blanks[to_uchar (*b)])
- b++;
+ skipblanks(&a, a + strlen(a));
+ skipblanks(&b, b + strlen(b));
int diff = find_unit_order (a) - find_unit_order (b);
return (diff ? diff : strnumcmp (a, b, decimal_point, thousands_sep));
--
2.5.5

13
SOURCES/coreutils-8.22-temporarytestoff.patch

@ -0,0 +1,13 @@
diff -urNp coreutils-8.22-orig/tests/df/df-symlink.sh coreutils-8.22/tests/df/df-symlink.sh
--- coreutils-8.22-orig/tests/df/df-symlink.sh 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/df/df-symlink.sh 2013-12-14 18:20:15.822594995 +0100
@@ -18,6 +18,9 @@
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
print_ver_ df
+#df doesn't work correctly on symlinks when on LVM/LUKS filesystem, therefore
+#marking expensive_ to disable by default
+expensive_
disk=$(df --out=source '.' | tail -n1) ||
skip_ "cannot determine '.' file system"

12
SOURCES/coreutils-8.22-vxfs-noinotify.patch

@ -0,0 +1,12 @@
diff -urNp coreutils-8.22-orig/src/fs-is-local.h coreutils-8.22/src/fs-is-local.h
--- coreutils-8.22-orig/src/fs-is-local.h 2013-12-13 15:17:10.000000000 +0100
+++ coreutils-8.22/src/fs-is-local.h 2015-06-04 11:06:34.161072669 +0200
@@ -98,7 +98,7 @@ is_local_fs_type (unsigned long int magi
case S_MAGIC_USBDEVFS: return 1;
case S_MAGIC_V9FS: return 1;
case S_MAGIC_VMHGFS: return 0;
- case S_MAGIC_VXFS: return 1;
+ case S_MAGIC_VXFS: return 0;
case S_MAGIC_VZFS: return 1;
case S_MAGIC_XENFS: return 1;
case S_MAGIC_XENIX: return 1;

29
SOURCES/coreutils-8.22-xfs-tests.patch

@ -0,0 +1,29 @@
From: Pádraig Brady <pbrady@redhat.com>

Avoid false failure due to speculative preallocation on XFS
Avoid false failure due to delayed allocation on BTRFS

diff -Naur coreutils-8.22.orig/tests/dd/sparse.sh coreutils-8.22/tests/dd/sparse.sh
--- coreutils-8.22.orig/tests/dd/sparse.sh 2013-12-04 14:48:30.000000000 +0000
+++ coreutils-8.22/tests/dd/sparse.sh 2015-05-19 21:24:55.139941789 +0000
@@ -58,11 +58,18 @@
# Ensure NUL blocks smaller than the block size are not made sparse.
# Here, with a 2MiB block size, dd's conv=sparse must *not* introduce a hole.
- dd if=file.in of=file.out bs=2M conv=sparse
+ dd if=file.in of=file.out bs=2M conv=sparse,fsync
test 2500 -lt $(kb_alloc file.out) || fail=1
+ # Note we recreate a sparse file first to avoid
+ # speculative preallocation seen in XFS, where a write() that
+ # extends a file can preallocate some extra space that
+ # a subsequent seek will not convert to a hole.
+ rm -f file.out
+ truncate --size=3M file.out
+
# Ensure that this 1MiB string of NULs *is* converted to a hole.
- dd if=file.in of=file.out bs=1M conv=sparse
+ dd if=file.in of=file.out bs=1M conv=sparse,notrunc,fsync
test $(kb_alloc file.out) -lt 2500 || fail=1
fi

93
SOURCES/coreutils-8.22-xfsbuildfailure.patch

@ -0,0 +1,93 @@
From eafaa2e88f7af16756142a31ab63d032b31395e3 Mon Sep 17 00:00:00 2001
From: Pádraig Brady <P@draigBrady.com>
Date: Fri, 06 Nov 2015 16:31:22 +0000
Subject: tests: fix dirent d_type support verification

* tests/d_type-check: Check also the d_type of files,
which excludes XFS appropriately. Specify all argument
and return types to avoid truncated pointers being passed,
which skipped the test due to crashes on x86_64 at least.
Simplify the C library lookup by reusing the interpreter's.

chroot issue reported at https://bugzilla.redhat.com/1263341
---
diff --git a/tests/d_type-check b/tests/d_type-check
index ff1eb60..1a2f76f 100644
--- a/tests/d_type-check
+++ b/tests/d_type-check
@@ -1,13 +1,17 @@
#!/usr/bin/python
-# Exit 0 if "." has useful d_type information, else 1.
+# Exit 0 if "." and "./tempfile" have useful d_type information, else 1.
# Intended to exit 0 only on Linux/GNU systems.
+import os
import sys
+import tempfile
fail = 1
+fname = None
+
try:
import ctypes
- (DT_UNKNOWN, DT_DIR,) = (0, 4,)
+ (DT_UNKNOWN, DT_DIR, DT_REG) = (0, 4, 8)
class dirent(ctypes.Structure):
_fields_ = [
@@ -17,20 +21,48 @@ try:
("d_type", ctypes.c_ubyte),
("d_name", ctypes.c_char*256)]
+ # Pass NULL to dlopen, assuming the python
+ # interpreter is linked with the C runtime
+ libc = ctypes.CDLL(None)
+
+ # Setup correct types for all args and returns
+ # even if only passing, to avoid truncation etc.
+ dirp = ctypes.c_void_p
direntp = ctypes.POINTER(dirent)
- # FIXME: find a way to avoid hard-coding libc's so-name.
- libc = ctypes.cdll.LoadLibrary("libc.so.6")
+ libc.readdir.argtypes = [dirp]
libc.readdir.restype = direntp
+ libc.opendir.restype = dirp
+
+ # Ensure a file is present
+ f, fname = tempfile.mkstemp(dir='.')
+ fname = os.path.basename(fname)
+
dirp = libc.opendir(".")
if dirp:
- ep = libc.readdir(dirp)
- if ep:
+ while True:
+ ep = libc.readdir(dirp)
+ if not ep: break
+ d_type = ep.contents.d_type
name = ep.contents.d_name
- if (name == "." or name == "..") and ep.contents.d_type == DT_DIR:
+ if name == "." or name == "..":
+ if d_type != DT_DIR: break
+ # Check files too since on XFS, only dirs have DT_DIR
+ # while everything else has DT_UNKNOWN
+ elif name == fname:
+ if d_type == DT_REG:
+ fail = 0
+ break
+ elif d_type != DT_DIR and d_type != DT_UNKNOWN:
fail = 0
+ break
+except:
+ pass
+try:
+ if fname:
+ os.unlink(fname);
except:
pass
--
cgit v0.9.0.2

12
SOURCES/coreutils-8.4-mkdir-modenote.patch

@ -0,0 +1,12 @@
diff -urNp coreutils-8.4-orig/doc/coreutils.texi coreutils-8.4/doc/coreutils.texi
--- coreutils-8.4-orig/doc/coreutils.texi 2011-01-07 15:01:18.575654333 +0100
+++ coreutils-8.4/doc/coreutils.texi 2011-01-07 15:05:38.791655243 +0100
@@ -9058,6 +9058,8 @@ incorrect. @xref{Directory Setuid and S
set-user-ID and set-group-ID bits of directories are inherited unless
overridden in this way.
+Note: The @option{--mode},@option{-m} option only applies to the right-most directories listed on the command line. When combined with @option{--parents}, @option{-p} option, any parent directories are created with @samp{u+wx} modified by umask.
+
@item -p
@itemx --parents
@opindex -p

263
SOURCES/coreutils-DIR_COLORS

@ -0,0 +1,263 @@
# Configuration file for the color ls utility
# Synchronized with coreutils 8.5 dircolors
# This file goes in the /etc directory, and must be world readable.
# You can copy this file to .dir_colors in your $HOME directory to override
# the system defaults.

# COLOR needs one of these arguments: 'tty' colorizes output to ttys, but not
# pipes. 'all' adds color characters to all output. 'none' shuts colorization
# off.
COLOR tty

# Extra command line options for ls go here.
# Basically these ones are:
# -F = show '/' for dirs, '*' for executables, etc.
# -T 0 = don't trust tab spacing when formatting ls output.
OPTIONS -F -T 0

# Below, there should be one TERM entry for each termtype that is colorizable
TERM Eterm
TERM ansi
TERM color-xterm
TERM con132x25
TERM con132x30
TERM con132x43
TERM con132x60
TERM con80x25
TERM con80x28
TERM con80x30
TERM con80x43
TERM con80x50
TERM con80x60
TERM cons25
TERM console
TERM cygwin
TERM dtterm
TERM eterm-color
TERM gnome
TERM gnome-256color
TERM jfbterm
TERM konsole
TERM kterm
TERM linux
TERM linux-c
TERM mach-color
TERM mlterm
TERM putty
TERM putty-256color
TERM rxvt
TERM rxvt-256color
TERM rxvt-cygwin
TERM rxvt-cygwin-native
TERM rxvt-unicode
TERM rxvt-unicode-256color
TERM rxvt-unicode256
TERM screen
TERM screen-256color
TERM screen-256color-bce
TERM screen-bce
TERM screen-w
TERM screen.Eterm
TERM screen.rxvt
TERM screen.linux
TERM st
TERM st-256color
TERM terminator
TERM vt100
TERM xterm
TERM xterm-16color
TERM xterm-256color
TERM xterm-88color
TERM xterm-color
TERM xterm-debian

# EIGHTBIT, followed by '1' for on, '0' for off. (8-bit output)
EIGHTBIT 1

# Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes:
# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
#NORMAL 00 # no color code at all
#FILE 00 # normal file, use no color at all
RESET 0 # reset to "normal" color
DIR 01;34 # directory
LINK 01;36 # symbolic link (If you set this to 'target' instead of a
# numerical value, the color is as for the file pointed to.)
MULTIHARDLINK 00 # regular file with more than one link
FIFO 40;33 # pipe
SOCK 01;35 # socket
DOOR 01;35 # door
BLK 40;33;01 # block device driver
CHR 40;33;01 # character device driver
ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file
MISSING 01;05;37;41 # ... and the files they point to
SETUID 37;41 # file that is setuid (u+s)
SETGID 30;43 # file that is setgid (g+s)
CAPABILITY 30;41 # file with capability
STICKY_OTHER_WRITABLE 30;42 # dir that is sticky and other-writable (+t,o+w)
OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky
STICKY 37;44 # dir with the sticky bit set (+t) and not other-writable

# This is for files with execute permission:
EXEC 01;32

# List any file extensions like '.gz' or '.tar' that you would like ls
# to colorize below. Put the extension, a space, and the color init string.
# (and any comments you want to add after a '#')
# executables (bright green)
#.cmd 01;32
#.exe 01;32
#.com 01;32
#.btm 01;32
#.bat 01;32
#.sh 01;32
#.csh 01;32

# archives or compressed (bright red)
.tar 01;31
.tgz 01;31
.arc 01;31
.arj 01;31
.taz 01;31
.lha 01;31
.lz4 01;31
.lzh 01;31
.lzma 01;31
.tlz 01;31
.txz 01;31
.tzo 01;31
.t7z 01;31
.zip 01;31
.z 01;31
.Z 01;31
.dz 01;31
.gz 01;31
.lrz 01;31
.lz 01;31
.lzo 01;31
.xz 01;31
.bz2 01;31
.bz 01;31
.tbz 01;31
.tbz2 01;31
.tz 01;31
.deb 01;31
.rpm 01;31
.jar 01;31
.war 01;31
.ear 01;31
.sar 01;31
.rar 01;31
.alz 01;31
.ace 01;31
.zoo 01;31
.cpio 01;31
.7z 01;31
.rz 01;31
.cab 01;31

# image formats (magenta)
.jpg 01;35
.jpeg 01;35
.gif 01;35
.bmp 01;35
.pbm 01;35
.pgm 01;35
.ppm 01;35
.tga 01;35
.xbm 01;35
.xpm 01;35
.tif 01;35
.tiff 01;35
.png 01;35
.svg 01;35
.svgz 01;35
.mng 01;35
.pcx 01;35
.mov 01;35
.mpg 01;35
.mpeg 01;35
.m2v 01;35
.mkv 01;35
.webm 01;35
.ogm 01;35
.mp4 01;35
.m4v 01;35
.mp4v 01;35
.vob 01;35
.qt 01;35
.nuv 01;35
.wmv 01;35
.asf 01;35
.rm 01;35
.rmvb 01;35
.flc 01;35
.avi 01;35
.fli 01;35
.flv 01;35
.gl 01;35
.dl 01;35
.xcf 01;35
.xwd 01;35
.yuv 01;35
.cgm 01;35
.emf 01;35

# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions
.axv 01;35
.anx 01;35
.ogv 01;35
.ogx 01;35

# audio formats (cyan)
.aac 01;36
.au 01;36
.flac 01;36
.mid 01;36
.midi 01;36
.mka 01;36
.mp3 01;36
.mpc 01;36
.ogg 01;36
.ra 01;36
.wav 01;36

# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions
.axa 01;36
.oga 01;36
.spx 01;36
.xspf 01;36

# colorize binary documents (brown)
#.pdf 00;33
#.ps 00;33
#.ps.gz 00;33
#.tex 00;33
#.xls 00;33
#.xlsx 00;33
#.ppt 00;33
#.pptx 00;33
#.rtf 00;33
#.doc 00;33
#.docx 00;33
#.odt 00;33
#.ods 00;33
#.odp 00;33
#.epub 00;33
#.abw 00;33
#.wpd 00;33
#
# colorize text documents (brown)
#.txt 00;33
#.patch 00;33
#.diff 00;33
#.log 00;33
#.htm 00;33
#.html 00;33
#.shtml 00;33
#.xml 00;33

233
SOURCES/coreutils-DIR_COLORS.256color

@ -0,0 +1,233 @@
# Configuration file for the 256color ls utility
# This file goes in the /etc directory, and must be world readable.
# Synchronized with coreutils 8.5 dircolors
# You can copy this file to .dir_colors in your $HOME directory to override
# the system defaults.
# In the case that you are not satisfied with supplied colors, please
# submit your color configuration or attach your file with colors readable
# on ALL color background schemas (white,gray,black) to RedHat Bugzilla
# ticket on https://bugzilla.redhat.com/show_bug.cgi?id=429121 . TIA.
# Please just keep ls color conventions from 8 color scheme.

# COLOR needs one of these arguments: 'tty' colorizes output to ttys, but not
# pipes. 'all' adds color characters to all output. 'none' shuts colorization
# off.
COLOR tty

# Extra command line options for ls go here.
# Basically these ones are:
# -F = show '/' for dirs, '*' for executables, etc.
# -T 0 = don't trust tab spacing when formatting ls output.
OPTIONS -F -T 0

# Below, there should be one TERM entry for each termtype that is colorizable
TERM putty-256color
TERM rxvt-256color
TERM rxvt-unicode-256color
TERM rxvt-unicode256
TERM screen-256color
TERM xterm-256color
TERM gnome-256color
TERM st-256color

# EIGHTBIT, followed by '1' for on, '0' for off. (8-bit output)
EIGHTBIT 1

# Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes:
# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color(8 colors mode) codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color(8 colors mode) codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
# Text color(256 colors mode) codes:
# Valid syntax for text 256color is 38;5;<color number> , where color number
# is number between 0 and 255.
# You may find following command useful to search the best one for you:
# for ((x=0; x<=255; x++));do echo -e "${x}:\033[38;5;${x}mcolor\033[000m";done
# Background color(256 colors mode) codes:
# Valid syntax for background 256color is 48;5;<color number> , where
# color number is number between 0 and 255.
# You may find following command useful to search the best one for you:
# for ((x=0; x<=255; x++));do echo -e "${x}:\033[48;5;${x}mcolor\033[000m";done

#NORMAL 00 # global default, no color code at all
#FILE 00 # normal file, use no color at all
RESET 0 # reset to "normal" color
DIR 38;5;27 # directory
LINK 38;5;51 # symbolic link (If you set this to 'target' instead of a
# numerical value, the color is as for the file pointed to.)
MULTIHARDLINK 44;38;5;15 # regular file with more than one link
FIFO 40;38;5;11 # pipe
SOCK 38;5;13 # socket
DOOR 38;5;5 # door
BLK 48;5;232;38;5;11 # block device driver
CHR 48;5;232;38;5;3 # character device driver
ORPHAN 48;5;232;38;5;9 # symlink to nonexistent file, or non-stat'able file
MISSING 05;48;5;232;38;5;15 # ... and the files they point to
SETUID 48;5;196;38;5;15 # file that is setuid (u+s)
SETGID 48;5;11;38;5;16 # file that is setgid (g+s)
CAPABILITY 48;5;196;38;5;226 # file with capability
STICKY_OTHER_WRITABLE 48;5;10;38;5;16 # dir that is sticky and other-writable (+t,o+w)
OTHER_WRITABLE 48;5;10;38;5;21 # dir that is other-writable (o+w) and not sticky
STICKY 48;5;21;38;5;15 # dir with the sticky bit set (+t) and not other-writable

# This is for files with execute permission:
EXEC 38;5;34

# List any file extensions like '.gz' or '.tar' that you would like ls
# to colorize below. Put the extension, a space, and the color init string.
# (and any comments you want to add after a '#')
# executables (bright green)
#.cmd 38;5;34
#.exe 38;5;34
#.com 38;5;34
#.btm 38;5;34
#.bat 38;5;34
#.sh 38;5;34
#.csh 38;5;34

# archives or compressed (bright red)
.tar 38;5;9
.tgz 38;5;9
.arc 38;5;9
.arj 38;5;9
.taz 38;5;9
.lha 38;5;9
.lz4 38;5;9
.lzh 38;5;9
.lzma 38;5;9
.tlz 38;5;9
.txz 38;5;9
.tzo 38;5;9
.t7z 38;5;9
.zip 38;5;9
.z 38;5;9
.Z 38;5;9
.dz 38;5;9
.gz 38;5;9
.lrz 38;5;9
.lz 38;5;9
.lzo 38;5;9
.xz 38;5;9
.bz2 38;5;9
.bz 38;5;9
.tbz 38;5;9
.tbz2 38;5;9
.tz 38;5;9
.deb 38;5;9
.rpm 38;5;9
.jar 38;5;9
.war 38;5;9
.ear 38;5;9
.sar 38;5;9
.rar 38;5;9
.alz 38;5;9
.ace 38;5;9
.zoo 38;5;9
.cpio 38;5;9
.7z 38;5;9
.rz 38;5;9
.cab 38;5;9

# image formats (magenta)
.jpg 38;5;13
.jpeg 38;5;13
.gif 38;5;13
.bmp 38;5;13
.pbm 38;5;13
.pgm 38;5;13
.ppm 38;5;13
.tga 38;5;13
.xbm 38;5;13
.xpm 38;5;13
.tif 38;5;13
.tiff 38;5;13
.png 38;5;13
.svg 38;5;13
.svgz 38;5;13
.mng 38;5;13
.pcx 38;5;13
.mov 38;5;13
.mpg 38;5;13
.mpeg 38;5;13
.m2v 38;5;13
.mkv 38;5;13
.webm 38;5;13
.ogm 38;5;13
.mp4 38;5;13
.m4v 38;5;13
.mp4v 38;5;13
.vob 38;5;13
.qt 38;5;13
.nuv 38;5;13
.wmv 38;5;13
.asf 38;5;13
.rm 38;5;13
.rmvb 38;5;13
.flc 38;5;13
.avi 38;5;13
.fli 38;5;13
.flv 38;5;13
.gl 38;5;13
.dl 38;5;13
.xcf 38;5;13
.xwd 38;5;13
.yuv 38;5;13
.cgm 38;5;13
.emf 38;5;13

# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions
.axv 38;5;13
.anx 38;5;13
.ogv 38;5;13
.ogx 38;5;13

# audio formats (cyan)
.aac 38;5;45
.au 38;5;45
.flac 38;5;45
.mid 38;5;45
.midi 38;5;45
.mka 38;5;45
.mp3 38;5;45
.mpc 38;5;45
.ogg 38;5;45
.ra 38;5;45
.wav 38;5;45

# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions
.axa 38;5;45
.oga 38;5;45
.spx 38;5;45
.xspf 38;5;45

# colorize binary documents (brown)
#.pdf 00;33
#.ps 00;33
#.ps.gz 00;33
#.tex 00;33
#.xls 00;33
#.xlsx 00;33
#.ppt 00;33
#.pptx 00;33
#.rtf 00;33
#.doc 00;33
#.docx 00;33
#.odt 00;33
#.ods 00;33
#.odp 00;33
#.epub 00;33
#.abw 00;33
#.wpd 00;33
#
# colorize text documents (brown)
#.txt 00;33
#.patch 00;33
#.diff 00;33
#.log 00;33
#.htm 00;33
#.html 00;33
#.shtml 00;33
#.xml 00;33

236
SOURCES/coreutils-DIR_COLORS.lightbgcolor

@ -0,0 +1,236 @@
# Configuration file for the color ls utility - modified for gray backgrounds
# Synchronized with coreutils 8.5 dircolors
# This file goes in the /etc directory, and must be world readable.
# You can copy this file to .dir_colors in your $HOME directory to override
# the system defaults.

# COLOR needs one of these arguments: 'tty' colorizes output to ttys, but not
# pipes. 'all' adds color characters to all output. 'none' shuts colorization
# off.
COLOR tty

# Extra command line options for ls go here.
# Basically these ones are:
# -F = show '/' for dirs, '*' for executables, etc.
# -T 0 = don't trust tab spacing when formatting ls output.
OPTIONS -F -T 0

# Below, there should be one TERM entry for each termtype that is colorizable
TERM linux
TERM console
TERM con132x25
TERM con132x30
TERM con132x43
TERM con132x60
TERM con80x25
TERM con80x28
TERM con80x30
TERM con80x43
TERM con80x50
TERM con80x60
TERM cons25
TERM xterm
TERM xterm-16color
TERM xterm-88color
TERM xterm-256color
TERM rxvt
TERM rxvt-256color
TERM rxvt-unicode
TERM rxvt-unicode-256color
TERM rxvt-unicode256
TERM xterm-color
TERM color-xterm
TERM vt100
TERM dtterm
TERM color_xterm

# EIGHTBIT, followed by '1' for on, '0' for off. (8-bit output)
EIGHTBIT 1

# Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes:
# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
#NORMAL 00 # no color code at all
#FILE 00 # normal file, use no color at all
RESET 0
DIR 00;34 # directory
LINK 00;36 # symbolic link (If you set this to 'target' instead of a
# numerical value, the color is as for the file pointed to.)
MULTIHARDLINK 00 # regular file with more than one link
FIFO 40;33 # pipe
SOCK 00;35 # socket
DOOR 00;35 # door
BLK 40;33;01 # block device driver
CHR 40;33;01 # character device driver
ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file
MISSING 01;05;37;41 # ... and the files they point to
SETUID 37;41 # file that is setuid (u+s)
SETGID 30;43 # file that is setgid (g+s)
CAPABILITY 30;41 # file with capability
STICKY_OTHER_WRITABLE 30;42 # dir that is sticky and other-writable (+t,o+w)
OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky
STICKY 37;44 # dir with the sticky bit set (+t) and not other-writable


# This is for files with execute permission:
EXEC 00;32

# List any file extensions like '.gz' or '.tar' that you would like ls
# to colorize below. Put the extension, a space, and the color init string.
# (and any comments you want to add after a '#')
#.cmd 00;32 # executables (green)
#.exe 00;32
#.com 00;32
#.btm 00;32
#.bat 00;32
#.sh 00;32
#.csh 00;32

# archives or compressed (red)
.tar 00;31
.tgz 00;31
.arc 00;31
.arj 00;31
.taz 00;31
.lha 00;31
.lz4 00;31
.lzh 00;31
.lzma 00;31
.tlz 00;31
.txz 00;31
.tzo 00;31
.t7z 00;31
.zip 00;31
.z 00;31
.Z 00;31
.dz 00;31
.gz 00;31
.lrz 00;31
.lz 00;31
.lzo 00;31
.xz 00;31
.bz2 00;31
.bz 00;31
.tbz 00;31
.tbz2 00;31
.tz 00;31
.deb 00;31
.rpm 00;31
.jar 00;31
.war 00;31
.ear 00;31
.sar 00;31
.rar 00;31
.alz 00;31
.ace 00;31
.zoo 00;31
.cpio 00;31
.7z 00;31
.rz 00;31
.cab 00;31

# image formats (magenta)
.jpg 00;35
.jpeg 00;35
.gif 00;35
.bmp 00;35
.pbm 00;35
.pgm 00;35
.ppm 00;35
.tga 00;35
.xbm 00;35
.xpm 00;35
.tif 00;35
.tiff 00;35
.png 00;35
.svg 00;35
.svgz 00;35
.mng 00;35
.pcx 00;35
.mov 00;35
.mpg 00;35
.mpeg 00;35
.m2v 00;35
.mkv 00;35
.webm 00;35
.ogm 00;35
.mp4 00;35
.m4v 00;35
.mp4v 00;35
.vob 00;35
.qt 00;35
.nuv 00;35
.wmv 00;35
.asf 00;35
.rm 00;35
.rmvb 00;35
.flc 00;35
.avi 00;35
.fli 00;35
.flv 00;35
.gl 00;35
.dl 00;35
.xcf 00;35
.xwd 00;35
.yuv 00;35
.cgm 00;35
.emf 00;35

# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions
.axv 00;35
.anx 00;35
.ogv 00;35
.ogx 00;35

# audio formats (cyan)
.aac 00;36
.au 00;36
.flac 00;36
.mid 00;36
.midi 00;36
.mka 00;36
.mp3 00;36
.mpc 00;36
.ogg 00;36
.ra 00;36
.wav 00;36

# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions
.axa 00;36
.oga 00;36
.spx 00;36
.xspf 00;36

# colorize binary documents (brown)
#.pdf 00;33
#.ps 00;33
#.ps.gz 00;33
#.tex 00;33
#.xls 00;33
#.xlsx 00;33
#.ppt 00;33
#.pptx 00;33
#.rtf 00;33
#.doc 00;33
#.docx 00;33
#.odt 00;33
#.ods 00;33
#.odp 00;33
#.epub 00;33
#.abw 00;33
#.wpd 00;33
#
# colorize text documents (brown)
#.txt 00;33
#.patch 00;33
#.diff 00;33
#.log 00;33
#.htm 00;33
#.html 00;33
#.shtml 00;33
#.xml 00;33

68
SOURCES/coreutils-colorls.csh

@ -0,0 +1,68 @@
# skip everything for non-interactive shells
if (! $?prompt) exit

# color-ls initialization
if ( $?USER_LS_COLORS ) then
if ( "$USER_LS_COLORS" != "" ) then
#when USER_LS_COLORS defined do not override user
#specified LS_COLORS and use them
goto finish
endif
endif

alias ll 'ls -l'
alias l. 'ls -d .*'
set COLORS=/etc/DIR_COLORS

if ($?TERM) then
if ( -e "/etc/DIR_COLORS.256color" ) then
if ( "`/usr/bin/tput colors`" == "256" ) then
set COLORS=/etc/DIR_COLORS.256color
endif
endif
if ( -e "/etc/DIR_COLORS.$TERM" ) then
set COLORS="/etc/DIR_COLORS.$TERM"
endif
endif
if ( -f ~/.dircolors ) set COLORS=~/.dircolors
if ( -f ~/.dir_colors ) set COLORS=~/.dir_colors
if ($?TERM) then
if ( -f ~/.dircolors."$TERM" ) set COLORS=~/.dircolors."$TERM"
if ( -f ~/.dir_colors."$TERM" ) set COLORS=~/.dir_colors."$TERM"
endif
set INCLUDE="`/usr/bin/cat "$COLORS" | /usr/bin/grep '^INCLUDE' | /usr/bin/cut -d ' ' -f2-`"

if ( ! -e "$COLORS" ) exit

set _tmp="`/usr/bin/mktemp .colorlsXXX -q --tmpdir=/tmp`"
#if mktemp fails, exit when include was active, otherwise use $COLORS file
if ( "$_tmp" == '' ) then
if ( "$INCLUDE" == '' ) then
eval "`/usr/bin/dircolors -c $COLORS`"
endif
goto cleanup
endif

if ( "$INCLUDE" != '' ) /usr/bin/cat "$INCLUDE" >> $_tmp
/usr/bin/grep -v '^INCLUDE' "$COLORS" >> $_tmp

eval "`/usr/bin/dircolors -c $_tmp`"

/usr/bin/rm -f $_tmp

if ( "$LS_COLORS" == '' ) exit
cleanup:
set color_none=`/usr/bin/sed -n '/^COLOR.*none/Ip' < $COLORS`
if ( "$color_none" != '' ) then
unset color_none
exit
endif
unset color_none
unset _tmp
unset INCLUDE
unset COLORS

finish:
alias ll 'ls -l --color=auto'
alias l. 'ls -d .* --color=auto'
alias ls 'ls --color=auto'

57
SOURCES/coreutils-colorls.sh

@ -0,0 +1,57 @@
# color-ls initialization

# Skip all for noninteractive shells.
[ ! -t 0 ] && return

#when USER_LS_COLORS defined do not override user LS_COLORS, but use them.
if [ -z "$USER_LS_COLORS" ]; then

alias ll='ls -l' 2>/dev/null
alias l.='ls -d .*' 2>/dev/null

INCLUDE=
COLORS=

for colors in "$HOME/.dir_colors.$TERM" "$HOME/.dircolors.$TERM" \
"$HOME/.dir_colors" "$HOME/.dircolors"; do
[ -e "$colors" ] && COLORS="$colors" && \
INCLUDE="`/usr/bin/cat "$COLORS" | /usr/bin/grep '^INCLUDE' | /usr/bin/cut -d ' ' -f2-`" && \
break
done

[ -z "$COLORS" ] && [ -e "/etc/DIR_COLORS.$TERM" ] && \
COLORS="/etc/DIR_COLORS.$TERM"

[ -z "$COLORS" ] && [ -e "/etc/DIR_COLORS.256color" ] && \
[ "x`/usr/bin/tty -s && /usr/bin/tput colors 2>/dev/null`" = "x256" ] && \
COLORS="/etc/DIR_COLORS.256color"

[ -z "$COLORS" ] && [ -e "/etc/DIR_COLORS" ] && \
COLORS="/etc/DIR_COLORS"

# Existence of $COLORS already checked above.
[ -n "$COLORS" ] || return

if [ -e "$INCLUDE" ];
then
TMP="`/usr/bin/mktemp .colorlsXXX -q --tmpdir=/tmp`"
[ -z "$TMP" ] && return

/usr/bin/cat "$INCLUDE" >> $TMP
/usr/bin/grep -v '^INCLUDE' "$COLORS" >> $TMP

eval "`/usr/bin/dircolors --sh $TMP 2>/dev/null`"
/usr/bin/rm -f $TMP
else
eval "`/usr/bin/dircolors --sh $COLORS 2>/dev/null`"
fi

[ -z "$LS_COLORS" ] && return
/usr/bin/grep -qi "^COLOR.*none" $COLORS >/dev/null 2>/dev/null && return
fi

unset TMP COLORS INCLUDE

alias ll='ls -l --color=auto' 2>/dev/null
alias l.='ls -d .* --color=auto' 2>/dev/null
alias ls='ls --color=auto' 2>/dev/null

170
SOURCES/coreutils-df-direct.patch

@ -0,0 +1,170 @@
diff -urNp coreutils-8.21-orig/doc/coreutils.texi coreutils-8.21/doc/coreutils.texi
--- coreutils-8.21-orig/doc/coreutils.texi 2013-02-11 10:37:28.000000000 +0100
+++ coreutils-8.21/doc/coreutils.texi 2013-02-15 10:15:26.497593689 +0100
@@ -10961,6 +10961,13 @@ pseudo-file-systems, such as automounter
Scale sizes by @var{size} before printing them (@pxref{Block size}).
For example, @option{-BG} prints sizes in units of 1,073,741,824 bytes.
+@item --direct
+@opindex --direct
+@cindex direct statfs for a file
+Do not resolve mount point and show statistics directly for a file. It can be
+especially useful for NFS mount points if there is a boundary between two
+storage policies behind the mount point.
+
@item --total
@opindex --total
@cindex grand total of disk size, usage and available space
diff -urNp coreutils-8.21-orig/src/df.c coreutils-8.21/src/df.c
--- coreutils-8.21-orig/src/df.c 2013-02-05 00:40:31.000000000 +0100
+++ coreutils-8.21/src/df.c 2013-02-15 10:26:41.158651782 +0100
@@ -116,6 +116,9 @@ static bool print_type;
/* If true, print a grand total at the end. */
static bool print_grand_total;
+/* If true, show statistics for a file instead of mount point. */
+static bool direct_statfs;
+
/* Grand total data. */
static struct fs_usage grand_fsu;
@@ -238,13 +241,15 @@ enum
NO_SYNC_OPTION = CHAR_MAX + 1,
SYNC_OPTION,
TOTAL_OPTION,
- OUTPUT_OPTION
+ OUTPUT_OPTION,
+ DIRECT_OPTION
};
static struct option const long_options[] =
{
{"all", no_argument, NULL, 'a'},
{"block-size", required_argument, NULL, 'B'},
+ {"direct", no_argument, NULL, DIRECT_OPTION},
{"inodes", no_argument, NULL, 'i'},
{"human-readable", no_argument, NULL, 'h'},
{"si", no_argument, NULL, 'H'},
@@ -500,7 +505,10 @@ get_header (void)
for (col = 0; col < ncolumns; col++)
{
char *cell = NULL;
- char const *header = _(columns[col]->caption);
+ char const *header = (columns[col]->field == TARGET_FIELD
+ && direct_statfs)?
+ _("File") :
+ _(columns[col]->caption);
if (columns[col]->field == SIZE_FIELD
&& (header_mode == DEFAULT_MODE
@@ -1150,6 +1158,19 @@ get_point (const char *point, const stru
static void
get_entry (char const *name, struct stat const *statp)
{
+ if (direct_statfs)
+ {
+ char *resolved = canonicalize_file_name (name);
+ if (resolved)
+ {
+ char *mp = find_mount_point (name, statp);
+ get_dev (NULL, mp, resolved, NULL, NULL, false, false, NULL, false);
+ free(mp);
+ free (resolved);
+ return;
+ }
+ }
+
if ((S_ISBLK (statp->st_mode) || S_ISCHR (statp->st_mode))
&& get_disk (name))
return;
@@ -1219,6 +1238,7 @@ or all file systems by default.\n\
-B, --block-size=SIZE scale sizes by SIZE before printing them; e.g.,\n\
'-BM' prints sizes in units of 1,048,576 bytes;\n\
see SIZE format below\n\
+ --direct show statistics for a file instead of mount point\n\
--total produce a grand total\n\
-h, --human-readable print sizes in human readable format (e.g., 1K 234M 2G)\
\n\
@@ -1305,6 +1325,9 @@ main (int argc, char **argv)
xstrtol_fatal (e, oi, c, long_options, optarg);
}
break;
+ case DIRECT_OPTION:
+ direct_statfs = true;
+ break;
case 'i':
if (header_mode == OUTPUT_MODE)
{
@@ -1408,6 +1431,13 @@ main (int argc, char **argv)
}
}
+ if (direct_statfs && show_local_fs)
+ {
+ error (0, 0, _("options --direct and --local (-l) are mutually "
+ "exclusive"));
+ usage (EXIT_FAILURE);
+ }
+
if (human_output_opts == -1)
{
if (posix_format)
diff -urNp coreutils-8.21-orig/tests/df/direct.sh coreutils-8.21/tests/df/direct.sh
--- coreutils-8.21-orig/tests/df/direct.sh 1970-01-01 01:00:00.000000000 +0100
+++ coreutils-8.21/tests/df/direct.sh 2013-02-15 10:15:26.503644446 +0100
@@ -0,0 +1,55 @@
+#!/bin/sh
+# Ensure "df --direct" works as documented
+
+# Copyright (C) 2010 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/init.sh"; path_prepend_ ../src
+print_ver_ df
+
+df || skip_ "df fails"
+
+DIR=`pwd` || framework_failure
+FILE="$DIR/file"
+touch "$FILE" || framework_failure
+echo "$FILE" > file_exp || framework_failure
+echo "Mounted on" > header_mounted_exp || framework_failure
+echo "File" > header_file_exp || framework_failure
+
+fail=0
+
+df --portability "$FILE" > df_out || fail=1
+df --portability --direct "$FILE" > df_direct_out || fail=1
+df --portability --direct --local "$FILE" > /dev/null 2>&1 && fail=1
+
+# check df header
+$AWK '{ if (NR==1) print $6 " " $7; }' df_out > header_mounted_out \
+ || framework_failure
+$AWK '{ if (NR==1) print $6; }' df_direct_out > header_file_out \
+ || framework_failure
+compare header_mounted_out header_mounted_exp || fail=1
+compare header_file_out header_file_exp || fail=1
+
+# check df output (without --direct)
+$AWK '{ if (NR==2) print $6; }' df_out > file_out \
+ || framework_failure
+compare file_out file_exp && fail=1
+
+# check df output (with --direct)
+$AWK '{ if (NR==2) print $6; }' df_direct_out > file_out \
+ || framework_failure
+compare file_out file_exp || fail=1
+
+Exit $fail

86
SOURCES/coreutils-getgrouplist.patch

@ -0,0 +1,86 @@
diff --git a/lib/getugroups.c b/lib/getugroups.c
index 299bae6..8ece29b 100644
--- a/lib/getugroups.c
+++ b/lib/getugroups.c
@@ -19,6 +19,9 @@
#include <config.h>
+/* We do not need this code if getgrouplist(3) is available. */
+#ifndef HAVE_GETGROUPLIST
+
#include "getugroups.h"
#include <errno.h>
@@ -123,3 +126,4 @@ getugroups (int maxcount, gid_t *grouplist, char const *username,
}
#endif /* HAVE_GRP_H */
+#endif /* have getgrouplist */
diff --git a/lib/mgetgroups.c b/lib/mgetgroups.c
index 76474c2..0a9d221 100644
--- a/lib/mgetgroups.c
+++ b/lib/mgetgroups.c
@@ -115,9 +115,17 @@ mgetgroups (char const *username, gid_t gid, gid_t **groups)
/* else no username, so fall through and use getgroups. */
#endif
- max_n_groups = (username
- ? getugroups (0, NULL, username, gid)
- : getgroups (0, NULL));
+ if (!username)
+ max_n_groups = getgroups(0, NULL);
+ else
+ {
+#ifdef HAVE_GETGROUPLIST
+ max_n_groups = 0;
+ getgrouplist (username, gid, NULL, &max_n_groups);
+#else
+ max_n_groups = getugroups (0, NULL, username, gid);
+#endif
+ }
/* If we failed to count groups because there is no supplemental
group support, then return an array containing just GID.
@@ -139,10 +147,25 @@ mgetgroups (char const *username, gid_t gid, gid_t **groups)
if (g == NULL)
return -1;
- ng = (username
- ? getugroups (max_n_groups, g, username, gid)
- : getgroups (max_n_groups - (gid != (gid_t) -1),
- g + (gid != (gid_t) -1)));
+ if (!username)
+ ng = getgroups (max_n_groups - (gid != (gid_t)-1), g + (gid != (gid_t)-1));
+ else
+ {
+#ifdef HAVE_GETGROUPLIST
+ int e;
+ ng = max_n_groups;
+ while ((e = getgrouplist (username, gid, g, &ng)) == -1
+ && ng > max_n_groups)
+ {
+ max_n_groups = ng;
+ g = xrealloc (g, max_n_groups * sizeof (GETGROUPS_T));
+ }
+ if (e == -1)
+ ng = -1;
+#else
+ ng = getugroups (max_n_groups, g, username, gid);
+#endif
+ }
if (ng < 0)
{
diff --git a/m4/jm-macros.m4 b/m4/jm-macros.m4
index 62777c7..5180243 100644
--- a/m4/jm-macros.m4
+++ b/m4/jm-macros.m4
@@ -78,6 +78,7 @@
fchown
fchmod
ftruncate
+ getgrouplist
iswspace
mkfifo
mbrlen

83
SOURCES/coreutils-i18n-fold-newline.patch

@ -0,0 +1,83 @@
From 493f1291993a352e47a79fa7471880289df2efc4 Mon Sep 17 00:00:00 2001
From: Kamil Dudka <kdudka@redhat.com>
Date: Fri, 3 Feb 2017 12:26:53 +0100
Subject: [PATCH] fold: preserve new-lines in mutlibyte text (#1418505)

---
src/fold.c | 55 +++++++++++++++++++++++++++----------------------------
1 file changed, 27 insertions(+), 28 deletions(-)

diff --git a/src/fold.c b/src/fold.c
index 51abea8..4106f24 100644
--- a/src/fold.c
+++ b/src/fold.c
@@ -342,39 +342,38 @@ fold_multibyte_text (FILE *istream, size_t width, int *saved_errno)
}
rescan:
- if (operating_mode == byte_mode) /* byte mode */
+ if (convfail)
+ increment = 1;
+ else if (wc == L'\n')
+ {
+ /* preserve newline */
+ fwrite (line_out, sizeof(char), offset_out, stdout);
+ START_NEW_LINE;
+ continue;
+ }
+ else if (operating_mode == byte_mode) /* byte mode */
increment = mblength;
else if (operating_mode == character_mode) /* character mode */
increment = 1;
- else /* column mode */
+ else /* column mode */
{
- if (convfail)
- increment = 1;
- else
+ switch (wc)
{
- switch (wc)
- {
- case L'\n':
- fwrite (line_out, sizeof(char), offset_out, stdout);
- START_NEW_LINE;
- continue;
-
- case L'\b':
- increment = (column > 0) ? -1 : 0;
- break;
-
- case L'\r':
- increment = -1 * column;
- break;
-
- case L'\t':
- increment = 8 - column % 8;
- break;
-
- default:
- increment = wcwidth (wc);
- increment = (increment < 0) ? 0 : increment;
- }
+ case L'\b':
+ increment = (column > 0) ? -1 : 0;
+ break;
+
+ case L'\r':
+ increment = -1 * column;
+ break;
+
+ case L'\t':
+ increment = 8 - column % 8;
+ break;
+
+ default:
+ increment = wcwidth (wc);
+ increment = (increment < 0) ? 0 : increment;
}
}
--
2.13.5

103
SOURCES/coreutils-i18n-sort-memleak.patch

@ -0,0 +1,103 @@
From e16ae8b0f8a16f05d5881ad282bd58b31645a34f Mon Sep 17 00:00:00 2001
From: Kamil Dudka <kdudka@redhat.com>
Date: Fri, 15 Jun 2018 12:47:38 +0200
Subject: [PATCH] Resolves: #1259942 - fix memory leak in sort/I18N
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Patches written by Pádraig.

Note that the corresponding i18n/sort-month test was not included
because it breaks unless sort is compiled -Dlint and we do not want
to decrease performance of the resulting RPMs (and valgrind is not
installed in production buildroots anyway).
---
src/sort.c | 37 ++++++++++++++++++++++---------------
1 file changed, 22 insertions(+), 15 deletions(-)

diff --git a/src/sort.c b/src/sort.c
index e47b039..c04b513 100644
--- a/src/sort.c
+++ b/src/sort.c
@@ -2861,8 +2861,8 @@ getmonth_mb (const char *s, size_t len, char **ea)
register int lo = 0, hi = MONTHS_PER_YEAR, result;
char *tmp;
size_t wclength, mblength;
- const char **pp;
- const wchar_t **wpp;
+ const char *pp;
+ const wchar_t *wpp;
wchar_t *month_wcs;
mbstate_t state;
@@ -2875,17 +2875,19 @@ getmonth_mb (const char *s, size_t len, char **ea)
if (len == 0)
return 0;
- month = (char *) xmalloc (len + 1);
+ if (SIZE_MAX - len < 1)
+ xalloc_die ();
+
+ month = (char *) xnmalloc (len + 1, MB_CUR_MAX);
- tmp = (char *) xmalloc (len + 1);
+ pp = tmp = (char *) xnmalloc (len + 1, MB_CUR_MAX);
memcpy (tmp, s, len);
tmp[len] = '\0';
- pp = (const char **)&tmp;
- month_wcs = (wchar_t *) xmalloc ((len + 1) * sizeof (wchar_t));
- memset (&state, '\0', sizeof(mbstate_t));
+ wpp = month_wcs = (wchar_t *) xnmalloc (len + 1, sizeof (wchar_t));
+ memset (&state, '\0', sizeof (mbstate_t));
- wclength = mbsrtowcs (month_wcs, pp, len + 1, &state);
- if (wclength == (size_t)-1 || *pp != NULL)
+ wclength = mbsrtowcs (month_wcs, &pp, len + 1, &state);
+ if (wclength == (size_t)-1 || pp != NULL)
error (SORT_FAILURE, 0, _("Invalid multibyte input %s."), quote(s));
for (i = 0; i < wclength; i++)
@@ -2898,10 +2900,8 @@ getmonth_mb (const char *s, size_t len, char **ea)
}
}
- wpp = (const wchar_t **)&month_wcs;
-
- mblength = wcsrtombs (month, wpp, len + 1, &state);
- assert (mblength != (-1) && *wpp == NULL);
+ mblength = wcsrtombs (month, &wpp, (len + 1) * MB_CUR_MAX, &state);
+ assert (mblength != (-1) && wpp == NULL);
do
{
@@ -5363,10 +5363,10 @@ main (int argc, char **argv)
if (nfiles == 0)
{
- static char *minus = (char *) "-";
nfiles = 1;
free (files);
- files = &minus;
+ files = xmalloc (sizeof *files);
+ *files = (char *) "-";
}
/* Need to re-check that we meet the minimum requirement for memory
@@ -5424,6 +5424,13 @@ main (int argc, char **argv)
sort (files, nfiles, outfile, nthreads);
}
+#ifdef lint
+ if (files_from)
+ readtokens0_free (&tok);
+ else
+ free (files);
+#endif
+
if (have_read_stdin && fclose (stdin) == EOF)
die (_("close failed"), "-");
--
2.14.4

4751
SOURCES/coreutils-i18n.patch

File diff suppressed because it is too large Load Diff

11
SOURCES/coreutils-overflow.patch

@ -0,0 +1,11 @@
--- coreutils-5.2.1/src/who.c.overflow 2005-05-25 09:59:06.000000000 +0100
+++ coreutils-5.2.1/src/who.c 2005-05-25 10:00:31.000000000 +0100
@@ -75,7 +75,7 @@
# define UT_TYPE_NEW_TIME(U) false
#endif
-#define IDLESTR_LEN 6
+#define IDLESTR_LEN 10
#if HAVE_STRUCT_XTMP_UT_PID
# define PIDSTR_DECL_AND_INIT(Var, Utmp_ent) \

529
SOURCES/coreutils-selinux.patch

@ -0,0 +1,529 @@
diff -urNp coreutils-8.21-orig/init.cfg coreutils-8.21/init.cfg
--- coreutils-8.21-orig/init.cfg 2013-01-31 01:46:24.000000000 +0100
+++ coreutils-8.21/init.cfg 2013-02-15 14:31:58.957469955 +0100
@@ -308,8 +308,8 @@ require_selinux_()
# Independent of whether SELinux is enabled system-wide,
# the current file system may lack SELinux support.
# Also the current build may have SELinux support disabled.
- case $(ls -Zd .) in
- '? .'|'unlabeled .')
+ case $(ls -Zd . | cut -f4 -d" ") in
+ '?'|'unlabeled')
test -z "$CONFIG_HEADER" \
&& framework_failure_ 'CONFIG_HEADER not defined'
grep '^#define HAVE_SELINUX_SELINUX_H 1' "$CONFIG_HEADER" > /dev/null \
diff -urNp coreutils-8.21-orig/man/chcon.x coreutils-8.21/man/chcon.x
--- coreutils-8.21-orig/man/chcon.x 2011-08-23 15:44:01.000000000 +0200
+++ coreutils-8.21/man/chcon.x 2013-02-15 14:31:58.937482694 +0100
@@ -1,4 +1,4 @@
[NAME]
-chcon \- change file security context
+chcon \- change file SELinux security context
[DESCRIPTION]
.\" Add any additional description here
diff -urNp coreutils-8.21-orig/man/runcon.x coreutils-8.21/man/runcon.x
--- coreutils-8.21-orig/man/runcon.x 2011-08-23 15:44:01.000000000 +0200
+++ coreutils-8.21/man/runcon.x 2013-02-15 14:31:58.938486496 +0100
@@ -1,5 +1,5 @@
[NAME]
-runcon \- run command with specified security context
+runcon \- run command with specified SELinux security context
[DESCRIPTION]
Run COMMAND with completely-specified CONTEXT, or with current or
transitioned security context modified by one or more of LEVEL,
diff -urNp coreutils-8.21-orig/src/copy.c coreutils-8.21/src/copy.c
--- coreutils-8.21-orig/src/copy.c 2013-02-07 10:37:05.000000000 +0100
+++ coreutils-8.21/src/copy.c 2013-02-15 14:31:58.941467872 +0100
@@ -2410,6 +2410,17 @@ copy_internal (char const *src_name, cha
else
{
omitted_permissions = 0;
+
+ /* For directories, the process global context could be reset for
+ descendents, so use it to set the context for existing dirs here.
+ This will also give earlier indication of failure to set ctx. */
+ if (x->set_security_context || x->preserve_security_context)
+ if (! set_file_security_ctx (dst_name, x->preserve_security_context,
+ false, x))
+ {
+ if (x->require_preserve_context)
+ goto un_backup;
+ }
}
/* Decide whether to copy the contents of the directory. */
@@ -2415,6 +2426,8 @@ copy_internal (char const *src_name, cha
{
/* Here, we are crossing a file system boundary and cp's -x option
is in effect: so don't copy the contents of this directory. */
+ if (x->preserve_security_context)
+ restore_default_fscreatecon_or_die ();
}
else
{
@@ -2602,7 +2613,7 @@ copy_internal (char const *src_name, cha
/* With -Z or --preserve=context, set the context for existing files.
Note this is done already for copy_reg() for reasons described therein. */
- if (!new_dst && !x->copy_as_regular
+ if (!new_dst && !x->copy_as_regular && !S_ISDIR (src_mode)
&& (x->set_security_context || x->preserve_security_context))
{
if (! set_file_security_ctx (dst_name, x->preserve_security_context,
diff -urNp coreutils-8.21-orig/src/cp.c coreutils-8.21/src/cp.c
--- coreutils-8.21-orig/src/cp.c 2013-02-07 10:37:05.000000000 +0100
+++ coreutils-8.21/src/cp.c 2013-02-15 14:31:58.945468929 +0100
@@ -201,6 +202,9 @@ Copy SOURCE to DEST, or multiple SOURCE(
all\n\
"), stdout);
fputs (_("\
+ -c deprecated, same as --preserve=context\n\
+"), stdout);
+ fputs (_("\
--no-preserve=ATTR_LIST don't preserve the specified attributes\n\
--parents use full source file name under DIRECTORY\n\
"), stdout);
@@ -933,7 +939,7 @@ main (int argc, char **argv)
we'll actually use backup_suffix_string. */
backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
- while ((c = getopt_long (argc, argv, "abdfHilLnprst:uvxPRS:TZ",
+ while ((c = getopt_long (argc, argv, "abcdfHilLnprst:uvxPRS:TZ",
long_opts, NULL))
!= -1)
{
@@ -981,6 +987,17 @@ main (int argc, char **argv)
copy_contents = true;
break;
+ case 'c':
+ fprintf (stderr, "%s: warning: option '-c' is deprecated, please use '--preserve=context' instead\n", argv[0]);
+ if ( x.set_security_context ) {
+ (void) fprintf(stderr, "%s: cannot force target context and preserve it\n", argv[0]);
+ exit( 1 );
+ }
+ else if (selinux_enabled) {
+ x.preserve_security_context = true;
+ x.require_preserve_context = true;
+ }
+ break;
case 'd':
x.preserve_links = true;
x.dereference = DEREF_NEVER;
diff -urNp coreutils-8.21-orig/src/id.c coreutils-8.21/src/id.c
--- coreutils-8.21-orig/src/id.c 2013-01-31 01:46:24.000000000 +0100
+++ coreutils-8.21/src/id.c 2013-02-15 14:31:58.946469154 +0100
@@ -106,7 +106,7 @@ int
main (int argc, char **argv)
{
int optc;
- int selinux_enabled = (is_selinux_enabled () > 0);
+ bool selinux_enabled = (is_selinux_enabled () > 0);
bool smack_enabled = is_smack_enabled ();
bool opt_zero = false;
char *pw_name = NULL;
diff -urNp coreutils-8.21-orig/src/install.c coreutils-8.21/src/install.c
--- coreutils-8.21-orig/src/install.c 2013-02-07 10:37:05.000000000 +0100
+++ coreutils-8.21/src/install.c 2013-02-15 14:31:58.948469440 +0100
@@ -639,7 +640,7 @@ In the 4th form, create all components o
-v, --verbose print the name of each directory as it is created\n\
"), stdout);
fputs (_("\
- --preserve-context preserve SELinux security context\n\
+ -P, --preserve-context preserve SELinux security context (-P deprecated)\n\
-Z, --context[=CTX] set SELinux security context of destination file to\n\
default type, or to CTX if specified\n\
"), stdout);
@@ -782,7 +783,7 @@ main (int argc, char **argv)
we'll actually use backup_suffix_string. */
backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
- while ((optc = getopt_long (argc, argv, "bcCsDdg:m:o:pt:TvS:Z", long_options,
+ while ((optc = getopt_long (argc, argv, "bcCsDdg:m:o:pPt:TvS:Z", long_options,
NULL)) != -1)
{
switch (optc)
@@ -853,6 +854,8 @@ main (int argc, char **argv)
no_target_directory = true;
break;
+ case 'P':
+ fprintf (stderr, "%s: warning: option '-P' is deprecated, please use '--preserve-context' instead\n", argv[0]);
case PRESERVE_CONTEXT_OPTION:
if (! selinux_enabled)
{
@@ -860,6 +862,10 @@ main (int argc, char **argv)
"this kernel is not SELinux-enabled"));
break;
}
+ if ( x.set_security_context ) {
+ (void) fprintf(stderr, "%s: cannot force target context and preserve it\n", argv[0]);
+ exit( 1 );
+ }
x.preserve_security_context = true;
use_default_selinux_context = false;
break;
diff -urNp coreutils-8.21-orig/src/ls.c coreutils-8.21/src/ls.c
--- coreutils-8.21-orig/src/ls.c 2013-02-03 04:24:02.000000000 +0100
+++ coreutils-8.21/src/ls.c 2013-02-15 14:31:58.953469008 +0100
@@ -165,7 +165,8 @@ enum filetype
symbolic_link,
sock,
whiteout,
- arg_directory
+ arg_directory,
+ command_line
};
/* Display letters and indicators for each filetype.
@@ -281,6 +282,7 @@ static void queue_directory (char const
bool command_line_arg);
static void sort_files (void);
static void parse_ls_color (void);
+static void print_scontext_format (const struct fileinfo *f);
/* Initial size of hash table.
Most hierarchies are likely to be shallower than this. */
@@ -350,7 +352,7 @@ static struct pending *pending_dirs;
static struct timespec current_time;
-static bool print_scontext;
+static int print_scontext = 0;
static char UNKNOWN_SECURITY_CONTEXT[] = "?";
/* Whether any of the files has an ACL. This affects the width of the
@@ -390,7 +392,9 @@ enum format
one_per_line, /* -1 */
many_per_line, /* -C */
horizontal, /* -x */
- with_commas /* -m */
+ with_commas, /* -m */
+ security_format, /* -Z */
+ invalid_format
};
static enum format format;
@@ -793,6 +797,9 @@ enum
SHOW_CONTROL_CHARS_OPTION,
SI_OPTION,
SORT_OPTION,
+ CONTEXT_OPTION,
+ LCONTEXT_OPTION,
+ SCONTEXT_OPTION,
TIME_OPTION,
TIME_STYLE_OPTION
};
@@ -839,7 +846,9 @@ static struct option const long_options[
{"time-style", required_argument, NULL, TIME_STYLE_OPTION},
{"color", optional_argument, NULL, COLOR_OPTION},
{"block-size", required_argument, NULL, BLOCK_SIZE_OPTION},
- {"context", no_argument, 0, 'Z'},
+ {"context", no_argument, 0, CONTEXT_OPTION},
+ {"lcontext", no_argument, 0, LCONTEXT_OPTION},
+ {"scontext", no_argument, 0, SCONTEXT_OPTION},
{"author", no_argument, NULL, AUTHOR_OPTION},
{GETOPT_HELP_OPTION_DECL},
{GETOPT_VERSION_OPTION_DECL},
@@ -849,12 +858,12 @@ static struct option const long_options[
static char const *const format_args[] =
{
"verbose", "long", "commas", "horizontal", "across",
- "vertical", "single-column", NULL
+ "vertical", "single-column", "context", NULL
};
static enum format const format_types[] =
{
long_format, long_format, with_commas, horizontal, horizontal,
- many_per_line, one_per_line
+ many_per_line, one_per_line, security_format
};
ARGMATCH_VERIFY (format_args, format_types);
@@ -1296,7 +1305,8 @@ main (int argc, char **argv)
/* Avoid following symbolic links when possible. */
if (is_colored (C_ORPHAN)
|| (is_colored (C_EXEC) && color_symlink_as_referent)
- || (is_colored (C_MISSING) && format == long_format))
+ || (is_colored (C_MISSING) && (format == long_format
+ || format == security_format)))
check_symlink_color = true;
/* If the standard output is a controlling terminal, watch out
@@ -1343,7 +1353,7 @@ main (int argc, char **argv)
if (dereference == DEREF_UNDEFINED)
dereference = ((immediate_dirs
|| indicator_style == classify
- || format == long_format)
+ || format == long_format || format == security_format)
? DEREF_NEVER
: DEREF_COMMAND_LINE_SYMLINK_TO_DIR);
@@ -1363,7 +1373,7 @@ main (int argc, char **argv)
format_needs_stat = sort_type == sort_time || sort_type == sort_size
|| format == long_format
- || print_scontext
+ || format == security_format || print_scontext
|| print_block_size;
format_needs_type = (! format_needs_stat
&& (recursive
@@ -1394,7 +1404,7 @@ main (int argc, char **argv)
}
else
do
- gobble_file (argv[i++], unknown, NOT_AN_INODE_NUMBER, true, "");
+ gobble_file (argv[i++], command_line, NOT_AN_INODE_NUMBER, true, "");
while (i < argc);
if (cwd_n_used)
@@ -1565,7 +1575,7 @@ decode_switches (int argc, char **argv)
ignore_mode = IGNORE_DEFAULT;
ignore_patterns = NULL;
hide_patterns = NULL;
- print_scontext = false;
+ print_scontext = 0;
/* FIXME: put this in a function. */
{
@@ -1941,13 +1951,27 @@ decode_switches (int argc, char **argv)
break;
case 'Z':
- print_scontext = true;
+ print_scontext = 1;
+ format = security_format;
break;
case_GETOPT_HELP_CHAR;
case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
+ case CONTEXT_OPTION: /* default security context format */
+ print_scontext = 1;
+ format = security_format;
+ break;
+ case LCONTEXT_OPTION: /* long format plus security context */
+ print_scontext = 1;
+ format = long_format;
+ break;
+ case SCONTEXT_OPTION: /* short form of new security format */
+ print_scontext = 0;
+ format = security_format;
+ break;
+
default:
usage (LS_FAILURE);
}
@@ -2883,6 +2907,7 @@ gobble_file (char const *name, enum file
memset (f, '\0', sizeof *f);
f->stat.st_ino = inode;
f->filetype = type;
+ f->scontext = NULL;
if (command_line_arg
|| format_needs_stat
@@ -2995,7 +3020,7 @@ gobble_file (char const *name, enum file
&& print_with_color && is_colored (C_CAP))
f->has_capability = has_capability_cache (absolute_name, f);
- if (format == long_format || print_scontext)
+ if (format == long_format || format == security_format || print_scontext)
{
bool have_scontext = false;
bool have_acl = false;
@@ -3016,7 +3041,7 @@ gobble_file (char const *name, enum file
err = 0;
}
- if (err == 0 && format == long_format)
+ if (err == 0 && (format == long_format || format == security_format))
{
int n = file_has_acl_cache (absolute_name, f);
err = (n < 0);
@@ -3035,7 +3060,8 @@ gobble_file (char const *name, enum file
}
if (S_ISLNK (f->stat.st_mode)
- && (format == long_format || check_symlink_color))
+ && (format == long_format || format == security_format
+ || check_symlink_color))
{
struct stat linkstats;
@@ -3054,6 +3080,7 @@ gobble_file (char const *name, enum file
command line are automatically traced if not being
listed as files. */
if (!command_line_arg || format == long_format
+ || format == security_format
|| !S_ISDIR (linkstats.st_mode))
{
/* Get the linked-to file's mode for the filetype indicator
@@ -3087,7 +3114,7 @@ gobble_file (char const *name, enum file
block_size_width = len;
}
- if (format == long_format)
+ if (format == long_format || format == security_format)
{
if (print_owner)
{
@@ -3591,6 +3618,13 @@ print_current_files (void)
print_long_format (sorted_file[i]);
DIRED_PUTCHAR ('\n');
}
+ break;
+ case security_format:
+ for (i = 0; i < cwd_n_used; i++)
+ {
+ print_scontext_format (sorted_file[i]);
+ DIRED_PUTCHAR ('\n');
+ }
break;
}
}
@@ -3753,6 +3787,67 @@ format_inode (char *buf, size_t buflen,
: (char *) "?");
}
+/* Print info about f in scontext format */
+static void
+print_scontext_format (const struct fileinfo *f)
+{
+ char modebuf[12];
+
+ /* 7 fields that may require LONGEST_HUMAN_READABLE bytes,
+ 1 10-byte mode string,
+ 9 spaces, one following each of these fields, and
+ 1 trailing NUL byte. */
+
+ char init_bigbuf[7 * LONGEST_HUMAN_READABLE + 10 + 9 + 1];
+ char *buf = init_bigbuf;
+ char *p;
+
+ p = buf;
+
+ if ( print_scontext ) { /* zero means terse listing */
+ filemodestring (&f->stat, modebuf);
+ if (! any_has_acl)
+ modebuf[10] = '\0';
+ else if (f->acl_type == ACL_T_SELINUX_ONLY)
+ modebuf[10] = '.';
+ else if (f->acl_type == ACL_T_YES)
+ modebuf[10] = '+';
+ modebuf[11] = '\0';
+
+ /* print mode */
+
+ (void) sprintf (p, "%s ", modebuf);
+ p += strlen (p);
+
+ /* print standard user and group */
+
+ DIRED_FPUTS (buf, stdout, p - buf);
+ format_user (f->stat.st_uid, owner_width, f->stat_ok);
+ format_group (f->stat.st_gid, group_width, f->stat_ok);
+ p = buf;
+ }
+
+ (void) sprintf (p, "%-32s ", f->scontext ?: "");
+ p += strlen (p);
+
+ DIRED_INDENT ();
+ DIRED_FPUTS (buf, stdout, p - buf);
+ size_t w = print_name_with_quoting (f, false, &dired_obstack, p - buf);
+
+ if (f->filetype == symbolic_link) {
+ if (f->linkname) {
+ DIRED_FPUTS_LITERAL (" -> ", stdout);
+ print_name_with_quoting (f, true, NULL, (p - buf) + w + 4);
+ if (indicator_style != none)
+ print_type_indicator (f->stat_ok, f->linkmode, f->filetype);
+ }
+ }
+ else {
+ if (indicator_style != none)
+ print_type_indicator (f->stat_ok, f->stat.st_mode, f->filetype);
+ }
+}
+
/* Print information about F in long format. */
static void
print_long_format (const struct fileinfo *f)
@@ -3844,9 +3939,15 @@ print_long_format (const struct fileinfo
The latter is wrong when nlink_width is zero. */
p += strlen (p);
+ if (print_scontext)
+ {
+ sprintf (p, "%-32s ", f->scontext ? f->scontext : "");
+ p += strlen (p);
+ }
+
DIRED_INDENT ();
- if (print_owner || print_group || print_author || print_scontext)
+ if (print_owner || print_group || print_author)
{
DIRED_FPUTS (buf, stdout, p - buf);
@@ -3859,9 +3960,6 @@ print_long_format (const struct fileinfo
if (print_author)
format_user (f->stat.st_author, author_width, f->stat_ok);
- if (print_scontext)
- format_user_or_group (f->scontext, 0, scontext_width);
-
p = buf;
}
@@ -4207,9 +4305,6 @@ print_file_name_and_frills (const struct
: human_readable (ST_NBLOCKS (f->stat), buf, human_output_opts,
ST_NBLOCKSIZE, output_block_size));
- if (print_scontext)
- printf ("%*s ", format == with_commas ? 0 : scontext_width, f->scontext);
-
size_t width = print_name_with_quoting (f, false, NULL, start_col);
if (indicator_style != none)
@@ -4417,9 +4512,6 @@ length_of_file_name_and_frills (const st
output_block_size))
: block_size_width);
- if (print_scontext)
- len += 1 + (format == with_commas ? strlen (f->scontext) : scontext_width);
-
quote_name (NULL, f->name, filename_quoting_options, &name_width);
len += name_width;
@@ -4856,9 +4948,16 @@ Sort entries alphabetically if none of -
-w, --width=COLS assume screen width instead of current value\n\
-x list entries by lines instead of by columns\n\
-X sort alphabetically by entry extension\n\
- -Z, --context print any SELinux security context of each file\n\
-1 list one file per line\n\
"), stdout);
+ fputs(_("\nSELinux options:\n\n\
+ --lcontext Display security context. Enable -l. Lines\n\
+ will probably be too wide for most displays.\n\
+ -Z, --context Display security context so it fits on most\n\
+ displays. Displays only mode, user, group,\n\
+ security context and file name.\n\
+ --scontext Display only security context and file name.\n\
+"), stdout);
fputs (HELP_OPTION_DESCRIPTION, stdout);
fputs (VERSION_OPTION_DESCRIPTION, stdout);
emit_size_note ();
diff -urNp coreutils-8.21-orig/tests/misc/selinux.sh coreutils-8.21/tests/misc/selinux.sh
--- coreutils-8.21-orig/tests/misc/selinux.sh 2013-01-31 01:46:24.000000000 +0100
+++ coreutils-8.21/tests/misc/selinux.sh 2013-02-15 14:31:58.957469955 +0100
@@ -37,7 +37,7 @@ chcon $ctx f d p ||
# inspect that context with both ls -Z and stat.
for i in d f p; do
- c=$(ls -dogZ $i|cut -d' ' -f3); test x$c = x$ctx || fail=1
+ c=$(ls -dogZ $i|cut -d' ' -f4); test x$c = x$ctx || fail=1
c=$(stat --printf %C $i); test x$c = x$ctx || fail=1
done

53
SOURCES/coreutils-selinuxmanpages.patch

@ -0,0 +1,53 @@
diff -urNp coreutils-6.10-orig/doc/coreutils.texi coreutils-6.10/doc/coreutils.texi
--- coreutils-6.10-orig/doc/coreutils.texi 2008-04-07 17:52:11.000000000 +0200
+++ coreutils-6.10/doc/coreutils.texi 2008-04-07 18:01:43.000000000 +0200
@@ -6981,6 +6981,11 @@ for i; do
exit $fail
@end example
+@item -c
+@cindex SELinux security context information, preserving
+Preserve SELinux security context of the original files if possible.
+Some file systems don't support storing of SELinux security context.
+
@item --copy-contents
@cindex directories, copying recursively
@cindex copying directories recursively
diff -urNp coreutils-8.22-orig/doc/coreutils.texi coreutils-8.22/doc/coreutils.texi
--- coreutils-8.22-orig/doc/coreutils.texi 2015-06-12 14:16:22.672832509 +0200
+++ coreutils-8.22/doc/coreutils.texi 2015-06-12 14:43:02.646303224 +0200
@@ -7311,13 +7311,32 @@ it also affects the HP-UX @command{ls} p
@item -Z
@itemx --context
+@itemx --scontext
+@itemx --lcontext
+@itemx --format=context
@opindex -Z
@opindex --context
+@opindex --format=security
+@opindex --scontext
+@opindex --lcontext
@cindex SELinux
@cindex security context
Display the SELinux security context or @samp{?} if none is found.
-When used with the @option{-l} option, print the security context
-to the left of the size column.
+@option{-Z} counts as format option and enables displaying of SELinux
+context.
+@option{--scontext} prints SELinux context left to the file name.
+@option{--lcontext} prints long format with SELinux context in the middle.
+@option{--context} prints permissions, user/group, context and file name (in comparison to @option{--lcontext}, omits size, modification time and number of hardlinks).
+
+Note: When multiple format options are used in @command{ls},
+the last one is used. Therefore @samp{ls -lZ} (security format
+is last - same as @samp{ls --context}) differs from @samp{ls -Zl}
+(long format with selinux context is shown, same as @samp{ls --lcontext})
+
+Do not rely on @option{--scontext} and @option{--lcontext}
+options in your scripts. They will be removed in next major
+version of Red Hat Enterprise Linux. @option{--context} behaviour
+will change (just enabling displaying SELinux context).
@end table

12
SOURCES/sh-utils-2.0.11-dateman.patch

@ -0,0 +1,12 @@
diff -urNp coreutils-5.97-orig/man/date.x coreutils-5.97/man/date.x
--- coreutils-5.97-orig/man/date.x 1999-11-02 15:07:36.000000000 +0100
+++ coreutils-5.97/man/date.x 2008-10-15 10:13:31.000000000 +0200
@@ -11,3 +11,8 @@
relative date, and numbers. An empty string indicates the beginning
of the day. The date string format is more complex than is easily
documented here but is fully described in the info documentation.
+[ENVIRONMENT]
+.TP
+TZ
+Specifies the timezone, unless overridden by command line parameters.
+If neither is specified, the setting from /etc/localtime is used.

2095
SPECS/coreutils.spec

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save