From 9a063f8a1f4bf2869587b4a1e0bcc9db62c81c158d3687603434829e7ab57246 Mon Sep 17 00:00:00 2001 From: Philipp Thomas Date: Mon, 28 Jul 2014 09:51:55 +0000 Subject: [PATCH] - Incorporate 9 bugfixes, one documentation update and two maintenance patches that won't harm (bnc#888215), See NEWS for specifics: coreutils-improve_df_--human_and_--si,_help_and_man_page.patch coreutils-avoid_sizeof_charPP__static_analysis_warning.patch coreutils-also_deduplicate_virtual_file_systems.patch coreutils-fix_handling_of_symlinks_in_mount_list.patch coreutils-ignore_non_file_system_entries_in_proc_mounts.patch coreutils-avoid_clang_-Wtautological-constant-out-of-range-compare_warning.patch coreutils-use_the_last_device_name_provided_by_the_system.patch coreutils-avoid_compiler_warnings_with_some_assert_implementations.patch coreutils-use_all_of_the_last_device_details_provided.patch coreutils-output_placeholder_values_for_inaccessible_mount_points.patch coreutils-look_for_accessible_mount_points_for_specified_devices.patch coreutils-report_correct_device_in_presence_of_eclipsed_mounts.patch coreutils-avoid_an_inconsequential_mem_leak.patch OBS-URL: https://build.opensuse.org/package/show/Base:System/coreutils?expand=0&rev=233 --- ...lso_deduplicate_virtual_file_systems.patch | 186 +++++++++++++ ...ls-avoid_an_inconsequential_mem_leak.patch | 44 +++ ...onstant-out-of-range-compare_warning.patch | 42 +++ ...ngs_with_some_assert_implementations.patch | 35 +++ ...zeof_charPP__static_analysis_warning.patch | 22 ++ ...x_handling_of_symlinks_in_mount_list.patch | 75 +++++ ...n_file_system_entries_in_proc_mounts.patch | 51 ++++ ..._--human_and_--si,_help_and_man_page.patch | 53 ++++ ...e_mount_points_for_specified_devices.patch | 55 ++++ ...values_for_inaccessible_mount_points.patch | 258 ++++++++++++++++++ ...evice_in_presence_of_eclipsed_mounts.patch | 200 ++++++++++++++ coreutils-testsuite.changes | 20 ++ coreutils-testsuite.spec | 31 +++ ..._of_the_last_device_details_provided.patch | 97 +++++++ ...t_device_name_provided_by_the_system.patch | 120 ++++++++ coreutils.changes | 20 ++ coreutils.spec | 31 +++ 17 files changed, 1340 insertions(+) create mode 100644 coreutils-also_deduplicate_virtual_file_systems.patch create mode 100644 coreutils-avoid_an_inconsequential_mem_leak.patch create mode 100644 coreutils-avoid_clang_-Wtautological-constant-out-of-range-compare_warning.patch create mode 100644 coreutils-avoid_compiler_warnings_with_some_assert_implementations.patch create mode 100644 coreutils-avoid_sizeof_charPP__static_analysis_warning.patch create mode 100644 coreutils-fix_handling_of_symlinks_in_mount_list.patch create mode 100644 coreutils-ignore_non_file_system_entries_in_proc_mounts.patch create mode 100644 coreutils-improve_df_--human_and_--si,_help_and_man_page.patch create mode 100644 coreutils-look_for_accessible_mount_points_for_specified_devices.patch create mode 100644 coreutils-output_placeholder_values_for_inaccessible_mount_points.patch create mode 100644 coreutils-report_correct_device_in_presence_of_eclipsed_mounts.patch create mode 100644 coreutils-use_all_of_the_last_device_details_provided.patch create mode 100644 coreutils-use_the_last_device_name_provided_by_the_system.patch diff --git a/coreutils-also_deduplicate_virtual_file_systems.patch b/coreutils-also_deduplicate_virtual_file_systems.patch new file mode 100644 index 0000000..9a26d76 --- /dev/null +++ b/coreutils-also_deduplicate_virtual_file_systems.patch @@ -0,0 +1,186 @@ +commit 2dc5d044a88fd64e11e35886e78b54a4a9fc2b23 +Author: Pádraig Brady +Date: Sat Jan 25 01:14:29 2014 +0000 + + df: also deduplicate virtual file systems + + * src/df.c (filter_mountlist): Remove the constraint that + a '/' needs to be in the device name for a mount entry to + be considered for deduplication. Virtual file systems also + have storage associated with them (like tmpfs for example), + and thus need to be deduplicated since they will be shown + in the default df output and subject to --total processing also. + * test/df/skip-duplicates.sh: Add a test to ensure we deduplicate + all entries, even for virtual file systems. Also avoid possible + length operations on many remote file systems in the initial + check of df operation. Also avoid the assumption that "/root" + is on the same file system as "/". + * NEWS: Mention the change in behavior. + +--- + NEWS | 6 ++++- + src/df.c | 31 +++++++++++++---------------- + tests/df/skip-duplicates.sh | 47 +++++++++++++++++++++++++++++++------------- + 3 files changed, 53 insertions(+), 31 deletions(-) + +Index: coreutils-8.22/NEWS +=================================================================== +--- coreutils-8.22.orig/NEWS 2014-07-25 23:59:19.944878976 +0200 ++++ coreutils-8.22/NEWS 2014-07-26 00:00:28.937016455 +0200 +@@ -1,6 +1,10 @@ + GNU coreutils NEWS -*- outline -*- + +-* Noteworthy changes in release 8.22 (2013-12-13) [stable] ++ Changes done after the release of 8.22 ++ ++ df now correctly elides duplicates for virtual file systems like tmpfs. ++ ++ Noteworthy changes in release 8.22 (2013-12-13) [stable] + + ** Bug fixes + +Index: coreutils-8.22/src/df.c +=================================================================== +--- coreutils-8.22.orig/src/df.c 2014-07-25 23:59:19.938879051 +0200 ++++ coreutils-8.22/src/df.c 2014-07-25 23:59:19.944878976 +0200 +@@ -630,26 +630,23 @@ filter_mount_list (void) + } + else + { +- /* If the device name is a real path name ... */ +- if (strchr (me->me_devname, '/')) ++ /* If we've already seen this device... */ ++ for (devlist = devlist_head; devlist; devlist = devlist->next) ++ if (devlist->dev_num == buf.st_dev) ++ break; ++ ++ if (devlist) + { +- /* ... 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; ++ discard_me = me; + +- if (devlist) ++ /* ...let the shorter mountdir win. */ ++ if ((strchr (me->me_devname, '/') ++ && ! strchr (devlist->me->me_devname, '/')) ++ || (strlen (devlist->me->me_mountdir) ++ > strlen (me->me_mountdir))) + { +- 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; +- } ++ discard_me = devlist->me; ++ devlist->me = me; + } + } + } +Index: coreutils-8.22/tests/df/skip-duplicates.sh +=================================================================== +--- coreutils-8.22.orig/tests/df/skip-duplicates.sh 2013-12-04 15:48:30.000000000 +0100 ++++ coreutils-8.22/tests/df/skip-duplicates.sh 2014-07-25 23:59:19.944878976 +0200 +@@ -21,19 +21,28 @@ + 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. ++export CU_NONROOT_FS=$(df --local --output=target 2>&1 | grep /. | head -n1) ++test -z "$CU_NONROOT_FS" && unique_entries=1 || unique_entries=2 ++ ++# Simulate an mtab file to test various cases. + cat > k.c <<'EOF' || framework_failure_ + #include + #include ++#include + #include + ++#define STREQ(a, b) (strcmp (a, b) == 0) ++ + struct mntent *getmntent (FILE *fp) + { ++ static char *nonroot_fs; ++ static int done; ++ + /* Prove that LD_PRELOAD works. */ +- static int done = 0; + if (!done) + { + fclose (fopen ("x", "w")); +@@ -43,18 +52,30 @@ 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="/fsname", .mnt_dir="/"}, ++ {.mnt_fsname="virtfs", .mnt_dir="/NONROOT"}, ++ {.mnt_fsname="virtfs", .mnt_dir="/NONROOT"}, + }; + +- 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. */ ++ } ++ ++ if (done == 1 && !getenv ("CU_TEST_DUPE_INVALID")) + done++; /* skip the first entry. */ + +- while (done++ <= 4) ++ while (done++ <= 6) + { + mntents[done-2].mnt_type = "-"; ++ if (STREQ (mntents[done-2].mnt_dir, "/NONROOT")) ++ mntents[done-2].mnt_dir = nonroot_fs; + return &mntents[done-2]; + } ++ + return NULL; + } + EOF +@@ -69,22 +90,22 @@ test -f x || skip_ "internal test failur + + # The fake mtab file should only contain entries + # having the same device number; thus the output should +-# consist of a header and one entry. ++# consist of a header and unique entries. + LD_PRELOAD=./k.so df >out || fail=1 +-test $(wc -l out && fail=1 +-test $(wc -l out || fail=1 +-test $(wc -l +Date: Sun Jul 13 19:16:42 2014 +0100 + + maint: avoid an inconsequential mem leak + + * src/df.c (get_disk): Avoid an inconsequential mem leak + spotted by coverity. Also s/duplicities/duplicates/. + +diff --git a/src/df.c b/src/df.c +index 063cabf..3ef5d33 100644 +--- a/src/df.c ++++ b/src/df.c +@@ -44,7 +44,7 @@ + proper_name ("Paul Eggert") + + /* Filled with device numbers of examined file systems to avoid +- duplicities in output. */ ++ duplicates in output. */ + static struct devlist + { + dev_t dev_num; +@@ -604,7 +604,7 @@ excluded_fstype (const char *fstype) + } + + /* Filter mount list by skipping duplicate entries. +- In the case of duplicities - based on the device number - the mount entry ++ In the case of duplicates - based on the device number - the mount entry + with a '/' in its me_devname (i.e. not pseudo name like tmpfs) wins. + If both have a real devname (e.g. bind mounts), then that with the shorter + me_mountdir wins. With DEVICES_ONLY == true (set with df -a), only update +@@ -1185,7 +1185,11 @@ get_disk (char const *disk) + { + best_match = me; + if (len == 1) /* Traditional root. */ +- break; ++ { ++ free (last_device); ++ free (canon_dev); ++ break; ++ } + else + best_match_len = len; + } diff --git a/coreutils-avoid_clang_-Wtautological-constant-out-of-range-compare_warning.patch b/coreutils-avoid_clang_-Wtautological-constant-out-of-range-compare_warning.patch new file mode 100644 index 0000000..be6324d --- /dev/null +++ b/coreutils-avoid_clang_-Wtautological-constant-out-of-range-compare_warning.patch @@ -0,0 +1,42 @@ +commit ffd1a1d8dee921e20db515e7d4b3c3e47006c8b4 +Author: Pádraig Brady +Date: Mon May 12 15:46:43 2014 +0100 + + maint: avoid clang -Wtautological-constant-out-of-range-compare warning + + * src/df.c (decode_output_arg): Use only enum constants to avoid + clang "warning: comparison of constant -1 with expression of + type 'display_field_t' is always false" + +diff --git a/src/df.c b/src/df.c +index a7fc57f..01ecca6 100644 +--- a/src/df.c ++++ b/src/df.c +@@ -144,7 +144,8 @@ typedef enum + IAVAIL_FIELD, /* inodes available */ + IPCENT_FIELD, /* inodes used in percent */ + TARGET_FIELD, /* mount point */ +- FILE_FIELD /* specified file name */ ++ FILE_FIELD, /* specified file name */ ++ INVALID_FIELD /* validation marker */ + } display_field_t; + + /* Flag if a field contains a block, an inode or another value. */ +@@ -372,7 +373,7 @@ decode_output_arg (char const *arg) + *comma++ = 0; + + /* process S. */ +- display_field_t field = -1; ++ display_field_t field = INVALID_FIELD; + for (unsigned int i = 0; i < ARRAY_CARDINALITY (field_data); i++) + { + if (STREQ (field_data[i].arg, s)) +@@ -381,7 +382,7 @@ decode_output_arg (char const *arg) + break; + } + } +- if (field == -1) ++ if (field == INVALID_FIELD) + { + error (0, 0, _("option --output: field %s unknown"), quote (s)); + usage (EXIT_FAILURE); diff --git a/coreutils-avoid_compiler_warnings_with_some_assert_implementations.patch b/coreutils-avoid_compiler_warnings_with_some_assert_implementations.patch new file mode 100644 index 0000000..bfead01 --- /dev/null +++ b/coreutils-avoid_compiler_warnings_with_some_assert_implementations.patch @@ -0,0 +1,35 @@ +commit 1239ac573df0a699d6999aed23caaf4a0eb099df +Author: Ben Walton +Date: Mon Jun 2 20:32:16 2014 +0100 + + maint: avoid compiler warnings with some assert() implementations + + * src/df.c (get_dev): asssert() on Solaris 10 is not marked as + __noreturn__ and thus the compiler may think V is uninitialized + later on in the function. + * THANKS.in: Remove the now committer. + +diff --git a/THANKS.in b/THANKS.in +index a92540a..6fd79d3 100644 +--- a/THANKS.in ++++ b/THANKS.in +@@ -77,7 +77,6 @@ Barry Kelly http://barrkel.blogspot.com/ + Bauke Jan Douma bjdouma@xs4all.nl + Ben Elliston bje@air.net.au + Ben Harris bjh21@netbsd.org +-Ben Walton bwalton@artsci.utoronto.ca + Bengt Martensson bengt@mathematik.uni-Bremen.de + Benjamin Cutler cutlerbc@simla.colostate.edu + Bernard Giroud bernard.giroud@creditlyonnais.ch +diff --git a/src/df.c b/src/df.c +index 82b0c5f..747d138 100644 +--- a/src/df.c ++++ b/src/df.c +@@ -953,6 +953,7 @@ get_dev (char const *disk, char const *mount_point, char const* file, + v = NULL; + break; + default: ++ v = NULL; /* Avoid warnings where assert() is not __noreturn__. */ + assert (!"bad field_type"); + } + diff --git a/coreutils-avoid_sizeof_charPP__static_analysis_warning.patch b/coreutils-avoid_sizeof_charPP__static_analysis_warning.patch new file mode 100644 index 0000000..6501263 --- /dev/null +++ b/coreutils-avoid_sizeof_charPP__static_analysis_warning.patch @@ -0,0 +1,22 @@ +commit 02807c611efa0d2052c4d2f852a84b22c49d9e52 +Author: Bernhard Voelker +Date: Wed Apr 16 10:43:09 2014 +0200 + + maint: df: avoid sizeof(char**) static analysis warning + + * src/df.c (alloc_table_row): Use the size of char** to enlarge + the table. Spotted by Coverity. + +diff --git a/src/df.c b/src/df.c +index 3036c74..e763943 100644 +--- a/src/df.c ++++ b/src/df.c +@@ -290,7 +290,7 @@ static void + alloc_table_row (void) + { + nrows++; +- table = xnrealloc (table, nrows, sizeof (char *)); ++ table = xnrealloc (table, nrows, sizeof (char **)); + table[nrows - 1] = xnmalloc (ncolumns, sizeof (char *)); + } + diff --git a/coreutils-fix_handling_of_symlinks_in_mount_list.patch b/coreutils-fix_handling_of_symlinks_in_mount_list.patch new file mode 100644 index 0000000..52e9991 --- /dev/null +++ b/coreutils-fix_handling_of_symlinks_in_mount_list.patch @@ -0,0 +1,75 @@ +commit fb902297f536df060ff10ef06bb8fe6cfe0c845e +Author: Pádraig Brady +Date: Mon May 12 13:29:01 2014 +0100 + + df: fix handling of symlinks in mount list + + The symlink handling in commit v8.21-172-g33660b4 was incomplete + in the case where there were symlinks in the mount list itself. + For example, in the case where /dev/mapper/fedora-home was in the + mount list and that in turn was a symlink to /dev/dm-2, we have: + + before> df --out=source /dev/mapper/fedora-home + devtmpfs + + after > df --out=source /dev/mapper/fedora-home + /dev/mapper/fedora-home + + * src/df.c (get_disk): Compare canonicalized device names from + the mount list. Note we still display the non canonicalized name, + even if longer, as we assume that is the most representative. + * tests/df/df-symlink.sh: This could theoretically fail on some systems + depending on the content of the mount list, but adjust to fail on any + system where symlinks are present in the mount list for the current dir. + +diff --git a/src/df.c b/src/df.c +index 2b5a54e..24897a3 100644 +--- a/src/df.c ++++ b/src/df.c +@@ -1056,13 +1056,19 @@ get_disk (char const *disk) + 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)) + { + size_t len = strlen (me->me_mountdir); + if (len < best_match_len) +@@ -1074,6 +1080,8 @@ get_disk (char const *disk) + best_match_len = len; + } + } ++ ++ free (canon_dev); + } + + free (resolved); +diff --git a/tests/df/df-symlink.sh b/tests/df/df-symlink.sh +index aaed810..6d96bd2 100755 +--- a/tests/df/df-symlink.sh ++++ b/tests/df/df-symlink.sh +@@ -28,4 +28,11 @@ df --out=source,target "$disk" > exp || skip_ "cannot get info for $disk" + df --out=source,target symlink > out || fail=1 + compare exp out || fail=1 + ++# Ensure we output the same values for device nodes and '.' ++# This was not the case in coreutil-8.22 on systems ++# where the device in the mount list was a symlink itself. ++# I.E. '.' => /dev/mapper/fedora-home -> /dev/dm-2 ++df --out=source,target '.' > out || fail=1 ++compare exp out || fail=1 ++ + Exit $fail diff --git a/coreutils-ignore_non_file_system_entries_in_proc_mounts.patch b/coreutils-ignore_non_file_system_entries_in_proc_mounts.patch new file mode 100644 index 0000000..7216c2f --- /dev/null +++ b/coreutils-ignore_non_file_system_entries_in_proc_mounts.patch @@ -0,0 +1,51 @@ +commit cbfb34c7d32e888b39e03a51a374ed664e9fa31b +Author: Pádraig Brady +Date: Mon May 12 14:49:13 2014 +0100 + + df: ignore non file system entries in /proc/mounts + + Linux with network namespaces contains entries in /proc/mounts like: + proc net:[4026532464] proc rw,nosuid,nodev,noexec,relatime 0 0 + resulting in a failure to stat 'net:[...]', inducing a warning + and an exit with failure status. + + * src/df.c (get_dev): Ignore all relative mount points. + * tests/df/skip-duplicates.sh: Add an entry to test relative dirs. + +diff --git a/src/df.c b/src/df.c +index 24897a3..a7fc57f 100644 +--- a/src/df.c ++++ b/src/df.c +@@ -853,6 +853,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, +diff --git a/tests/df/skip-duplicates.sh b/tests/df/skip-duplicates.sh +index d872f27..44f7d4c 100755 +--- a/tests/df/skip-duplicates.sh ++++ b/tests/df/skip-duplicates.sh +@@ -56,6 +56,7 @@ struct mntent *getmntent (FILE *fp) + {.mnt_fsname="/fsname", .mnt_dir="/"}, + {.mnt_fsname="virtfs", .mnt_dir="/NONROOT"}, + {.mnt_fsname="virtfs", .mnt_dir="/NONROOT"}, ++ {.mnt_fsname="netns", .mnt_dir="net:[1234567]"}, + }; + + if (done == 1) +@@ -68,7 +69,7 @@ struct mntent *getmntent (FILE *fp) + if (done == 1 && !getenv ("CU_TEST_DUPE_INVALID")) + done++; /* skip the first entry. */ + +- while (done++ <= 6) ++ while (done++ <= 7) + { + mntents[done-2].mnt_type = "-"; + if (STREQ (mntents[done-2].mnt_dir, "/NONROOT")) diff --git a/coreutils-improve_df_--human_and_--si,_help_and_man_page.patch b/coreutils-improve_df_--human_and_--si,_help_and_man_page.patch new file mode 100644 index 0000000..6b5a4dd --- /dev/null +++ b/coreutils-improve_df_--human_and_--si,_help_and_man_page.patch @@ -0,0 +1,53 @@ +commit 849c1c5b16c32756e14be719855601017770e621 +Author: Pádraig Brady +Date: Mon Mar 3 02:49:25 2014 +0000 + + doc: improve df --human and --si, help and man page + + * src/df.c (usage): Adjust the --human and --si descriptions + to not depend on each other. Also include an example that is + illustrative of the rounding, suffix, width, and localized fractions. + * src/system.h (emit_size_note). Adjust so that it's obvious the + description is pertaining to the input SIZE argument, and not + to any sizes that might be output by df for example. + Fixes http://bugs.gnu.org/16922 + +diff --git a/src/df.c b/src/df.c +index e4fafb9..3036c74 100644 +--- a/src/df.c ++++ b/src/df.c +@@ -1260,15 +1260,16 @@ or all file systems by default.\n\ + + emit_mandatory_arg_note (); + ++ /* TRANSLATORS: The thousands and decimal separators are best ++ adjusted to an appropriate default for your locale. */ + fputs (_("\ + -a, --all include dummy 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\ + --total produce a grand total\n\ +- -h, --human-readable print sizes in human readable format (e.g., 1K 234M 2G)\ +-\n\ +- -H, --si likewise, but use powers of 1000 not 1024\n\ ++ -h, --human-readable print sizes in powers of 1024 (e.g., 1023M)\n\ ++ -H, --si print sizes in powers of 1000 (e.g., 1.1G)\n\ + "), stdout); + fputs (_("\ + -i, --inodes list inode information instead of block usage\n\ +diff --git a/src/system.h b/src/system.h +index 39750e8..a9588e7 100644 +--- a/src/system.h ++++ b/src/system.h +@@ -549,8 +549,8 @@ static inline void + emit_size_note (void) + { + fputs (_("\n\ +-SIZE is an integer and optional unit (example: 10M is 10*1024*1024). Units\n\ +-are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB, ... (powers of 1000).\n\ ++The SIZE argument is an integer and optional unit (example: 10K is 10*1024).\n\ ++Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).\n\ + "), stdout); + } + diff --git a/coreutils-look_for_accessible_mount_points_for_specified_devices.patch b/coreutils-look_for_accessible_mount_points_for_specified_devices.patch new file mode 100644 index 0000000..3eee8e1 --- /dev/null +++ b/coreutils-look_for_accessible_mount_points_for_specified_devices.patch @@ -0,0 +1,55 @@ +commit 828801a174de8fa6e492f311210c37394f13b30f +Author: Pádraig Brady +Date: Wed Jun 18 13:10:17 2014 +0100 + + df: look for accessible mount points for specified devices + + * src/df.c (get_disk): Include whether we can access the mount dir, + in the mount entry selection criteria. This handles the case where + a device is (bind) mounted multiple times with the shortest mount path + not being accessible, while some of the other mount points are. + Discussed at: http://bugs.gnu.org/16539#63 + +diff --git a/src/df.c b/src/df.c +index d6d4b0e..dc6544b 100644 +--- a/src/df.c ++++ b/src/df.c +@@ -1121,6 +1121,7 @@ get_disk (char const *disk) + { + struct mount_entry const *me; + struct mount_entry const *best_match = NULL; ++ bool best_match_accessible = false; + char const *file = disk; + + char *resolved = canonicalize_file_name (disk); +@@ -1139,13 +1140,24 @@ get_disk (char const *disk) + if (STREQ (disk, devname)) + { + size_t len = strlen (me->me_mountdir); +- if (len < best_match_len) ++ ++ if (! 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. */ ++ break; ++ else ++ best_match_len = len; ++ } + } + } + diff --git a/coreutils-output_placeholder_values_for_inaccessible_mount_points.patch b/coreutils-output_placeholder_values_for_inaccessible_mount_points.patch new file mode 100644 index 0000000..2f1ec01 --- /dev/null +++ b/coreutils-output_placeholder_values_for_inaccessible_mount_points.patch @@ -0,0 +1,258 @@ +commit 9d736f8dbfef2b33d431dccf852dace9cfc84d59 +Author: Pádraig Brady +Date: Wed Jun 4 00:09:11 2014 +0100 + + df: output placeholder values for inaccessible mount points + + A system provided mount entry may be unavailable due to TOCTOU race, + or if another device has been over-mounted at that position, or due to + access permissions. In all these cases output "-" placeholder values + rather than either producing an error, or in the over-mount case + outputting values for the wrong device. + + * src/df.c (device_list): A new global list now updated by + filter_mount_list(). + (filter_mount_list): Adjust to take a parameter as to whether + update the global mount list, or only the mount <-> device ID mapping. + (get_dev): Use the device ID mapping to ensure we're not outputting + stats for the wrong device. Also output placeholder values when we + can't access a system specified mount point. + (get_all_entries): Set the DEVICE_ONLY param for filter_mount_list(). + (devname_for_dev): A new function to search the mount <-> dev mapping. + * test/df/skip-duplicates.sh: Adjust accordingly. + * NEWS: Mention the bug fixes. + + Discussed at: http://bugs.gnu.org/16539 + +--- + NEWS | 6 +- + src/df.c | 109 ++++++++++++++++++++++++++++++++------------ + tests/df/skip-duplicates.sh | 6 +- + 3 files changed, 89 insertions(+), 32 deletions(-) + +Index: coreutils-8.22/NEWS +=================================================================== +--- coreutils-8.22.orig/NEWS 2014-07-26 00:02:00.484871949 +0200 ++++ coreutils-8.22/NEWS 2014-07-26 00:02:31.465484639 +0200 +@@ -2,8 +2,10 @@ GNU coreutils NEWS + + Changes done after the release of 8.22 + +- df now elides duplicates for virtual file systems like tmpfs, and will +- display the correct device name for directories mounted multiple times. ++ df now elides duplicates for virtual file systems like tmpfs. ++ Displays the correct device details for points mounted multiple times. ++ Displays placeholder values for inaccessible file systems, ++ rather than error messages or values for the wrong file system. + [These bugs were present in "the beginning".] + + Noteworthy changes in release 8.22 (2013-12-13) [stable] +Index: coreutils-8.22/src/df.c +=================================================================== +--- coreutils-8.22.orig/src/df.c 2014-07-26 00:02:00.468872150 +0200 ++++ coreutils-8.22/src/df.c 2014-07-26 00:02:00.485871937 +0200 +@@ -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. */ +@@ -607,23 +607,25 @@ excluded_fstype (const char *fstype) + In the case of duplicities - based on the device number - the mount entry + with a '/' in its me_devname (i.e. not pseudo name like tmpfs) wins. + If both have a real devname (e.g. bind mounts), then that with the shorter +- me_mountdir wins. */ ++ me_mountdir wins. With DEVICES_ONLY == true (set with df -a), only update ++ the global device_list, rather than filtering the global mount_list. */ + + 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. */ ++ /* Sort all 'wanted' entries into the list device_list. */ + for (me = mount_list; me;) + { + struct stat buf; + struct devlist *devlist; + struct mount_entry *discard_me = NULL; + ++ /* TODO: On Linux we might avoid this stat() and another in get_dev() ++ by using the device IDs available from /proc/self/mountinfo. ++ read_file_system_list() could populate me_dev from those ++ for efficiency and accuracy. */ + if (-1 == stat (me->me_mountdir, &buf)) + { + /* Stat failed - add ME to be able to complain about it later. */ +@@ -632,7 +634,7 @@ filter_mount_list (void) + else + { + /* If we've already seen this device... */ +- for (devlist = devlist_head; devlist; devlist = devlist->next) ++ for (devlist = device_list; devlist; devlist = devlist->next) + if (devlist->dev_num == buf.st_dev) + break; + +@@ -661,8 +663,9 @@ filter_mount_list (void) + + if (discard_me) + { +- me = me->me_next; +- free_mount_entry (discard_me); ++ me = me->me_next; ++ if (! devices_only) ++ free_mount_entry (discard_me); + } + else + { +@@ -670,26 +673,46 @@ 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 device name if found or NULL if not. */ ++ ++static char const * _GL_ATTRIBUTE_PURE ++devname_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->me_devname; ++ dl = dl->next; + } ++ ++ return NULL; + } + + /* Return true if N is a known integer value. On many file systems, +@@ -878,9 +901,40 @@ get_dev (char const *disk, char const *m + 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. */ ++ struct stat sb; ++ if (stat (stat_file, &sb) == 0) ++ { ++ char const * devname = devname_for_dev (sb.st_dev); ++ if (devname && ! STREQ (devname, disk)) ++ { ++ 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) +@@ -1230,8 +1284,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, +Index: coreutils-8.22/tests/df/skip-duplicates.sh +=================================================================== +--- coreutils-8.22.orig/tests/df/skip-duplicates.sh 2014-07-26 00:02:00.468872150 +0200 ++++ coreutils-8.22/tests/df/skip-duplicates.sh 2014-07-26 00:02:00.485871937 +0200 +@@ -96,8 +96,8 @@ test -f x || skip_ "internal test failur + LD_PRELOAD=./k.so df -T >out || fail=1 + test $(wc -l out && fail=1 ++# Ensure we don't fail when unable to stat (currently) unavailable entries ++LD_PRELOAD=./k.so CU_TEST_DUPE_INVALID=1 df -T >out || fail=1 + test $(wc -l out || fail=1 + test $(wc -l +Date: Tue Jun 24 15:34:39 2014 +0100 + + df: report correct device in presence of eclipsed mounts + + * src/df.c (last_device_for_mount): A new function to identify + the last device mounted for a mount point. + (get_disk): Use the above to discard mount entries for a device, + where a later mount entry uses a different device name than + that of the user specified device. + * tests/df/over-mount-device.sh: A new root test. + * tests/local.mk: Reference the new test. + * NEWS: Reword for all these related recent fixes. + Discussed at: http://bugs.gnu.org/16539#69 + +--- + NEWS | 9 +++--- + src/df.c | 42 ++++++++++++++++++++++++++++++ + tests/df/over-mount-device.sh | 57 ++++++++++++++++++++++++++++++++++++++++++ + tests/local.mk | 1 + 4 files changed, 104 insertions(+), 5 deletions(-) + +Index: coreutils-8.22/NEWS +=================================================================== +--- coreutils-8.22.orig/NEWS 2014-07-26 00:03:09.335011204 +0200 ++++ coreutils-8.22/NEWS 2014-07-26 00:03:30.216750147 +0200 +@@ -2,10 +2,11 @@ GNU coreutils NEWS + + Changes done after the release of 8.22 + +- df now elides duplicates for virtual file systems like tmpfs. +- Displays the correct device details for points mounted multiple times. +- Displays placeholder values for inaccessible file systems, +- rather than error messages or values for the wrong file system. ++ df has more fixes related to the newer dynamic representation of file systems: ++ Duplicates are elided for virtual file systems like tmpfs. ++ Details for the correct device are output for points mounted multiple times. ++ Placeholder values are output for inaccessible file systems, rather than ++ than error messages or values for the wrong file system. + [These bugs were present in "the beginning".] + + Noteworthy changes in release 8.22 (2013-12-13) [stable] +Index: coreutils-8.22/src/df.c +=================================================================== +--- coreutils-8.22.orig/src/df.c 2014-07-26 00:03:09.327011304 +0200 ++++ coreutils-8.22/src/df.c 2014-07-26 00:03:09.335011204 +0200 +@@ -1114,6 +1114,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 +@@ -1122,6 +1149,7 @@ 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); +@@ -1139,9 +1167,12 @@ get_disk (char const *disk) + + 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 (! best_match_accessible || len < best_match_len) ++ if (! eclipsed_device ++ && (! best_match_accessible || len < best_match_len)) + { + struct stat disk_stats; + bool this_match_accessible = false; +@@ -1159,6 +1190,8 @@ get_disk (char const *disk) + best_match_len = len; + } + } ++ ++ free (last_device); + } + + free (canon_dev); +@@ -1173,6 +1206,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; + } +Index: coreutils-8.22/tests/df/over-mount-device.sh +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ coreutils-8.22/tests/df/over-mount-device.sh 2014-07-26 00:03:09.335011204 +0200 +@@ -0,0 +1,57 @@ ++#!/bin/sh ++# Ensure that df /dev/loop0 errors out if overmounted by another device ++ ++# 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 . ++ ++. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src ++print_ver_ df ++require_root_ ++ ++cwd=$(pwd) ++cleanup_() { cd /; umount "$cwd/mnt"; umount "$cwd/mnt"; } ++ ++skip=0 ++ ++# Create 2 file systems ++for i in 1 2; do ++ dd if=/dev/zero of=blob$i bs=8192 count=200 > /dev/null 2>&1 \ ++ || skip=1 ++ mkfs -t ext2 -F blob$i \ ++ || skip_ "failed to create ext2 file system" ++done ++ ++# Mount both at the same place (eclipsing the first) ++mkdir mnt || skip=1 ++mount -oloop blob1 mnt || skip=1 ++eclipsed_dev=$(df --o=source mnt | tail -n1) || skip=1 ++mount -oloop blob2 mnt || skip=1 ++ ++test $skip = 1 \ ++ && skip_ "insufficient mount/ext2 support" ++ ++df . || skip_ "failed to lookup the device for the current dir" ++ ++echo "df: cannot access '$eclipsed_dev': over-mounted by another device" > exp ++ ++# We should get an error for the eclipsed device and continue ++df $eclipsed_dev . > out 2> err && fail=1 ++ ++# header and single entry in output ++test $(wc -l < out) = 2 || fail=1 ++ ++compare exp err || fail=1 ++ ++Exit $fail +Index: coreutils-8.22/tests/local.mk +=================================================================== +--- coreutils-8.22.orig/tests/local.mk 2014-07-26 00:03:09.203012855 +0200 ++++ coreutils-8.22/tests/local.mk 2014-07-26 00:03:09.335011204 +0200 +@@ -115,6 +115,7 @@ all_root_tests = \ + tests/cp/sparse-fiemap.sh \ + tests/dd/skip-seek-past-dev.sh \ + tests/df/problematic-chars.sh \ ++ tests/df/over-mount-device.sh \ + tests/du/bind-mount-dir-cycle.sh \ + tests/id/setgid.sh \ + tests/install/install-C-root.sh \ diff --git a/coreutils-testsuite.changes b/coreutils-testsuite.changes index 913e8db..e6eea80 100644 --- a/coreutils-testsuite.changes +++ b/coreutils-testsuite.changes @@ -1,3 +1,23 @@ +------------------------------------------------------------------- +Fri Jul 25 23:48:47 CEST 2014 - pth@suse.de + +- Incorporate 9 bugfixes, one documentation update and two maintenance + patches that won't harm (bnc#888215), See NEWS for specifics: + + coreutils-improve_df_--human_and_--si,_help_and_man_page.patch + coreutils-avoid_sizeof_charPP__static_analysis_warning.patch + coreutils-also_deduplicate_virtual_file_systems.patch + coreutils-fix_handling_of_symlinks_in_mount_list.patch + coreutils-ignore_non_file_system_entries_in_proc_mounts.patch + coreutils-avoid_clang_-Wtautological-constant-out-of-range-compare_warning.patch + coreutils-use_the_last_device_name_provided_by_the_system.patch + coreutils-avoid_compiler_warnings_with_some_assert_implementations.patch + coreutils-use_all_of_the_last_device_details_provided.patch + coreutils-output_placeholder_values_for_inaccessible_mount_points.patch + coreutils-look_for_accessible_mount_points_for_specified_devices.patch + coreutils-report_correct_device_in_presence_of_eclipsed_mounts.patch + coreutils-avoid_an_inconsequential_mem_leak.patch + ------------------------------------------------------------------- Sun Mar 16 20:38:48 UTC 2014 - mail@bernhard-voelker.de diff --git a/coreutils-testsuite.spec b/coreutils-testsuite.spec index 9d96cbc..09c61b4 100644 --- a/coreutils-testsuite.spec +++ b/coreutils-testsuite.spec @@ -142,6 +142,23 @@ Patch306: coreutils-date-avoid-crash-in-TZ-parsing.patch # shuf --repeat no longer dumps core if the input is empty. Patch307: coreutils-shuf-repeat-avoid-crash-when-input-empty.patch +# These arte all upstream fixes that will be part of the upcoming 8.23 +# and can thus be removed on updating the package. + +Patch401: coreutils-improve_df_--human_and_--si,_help_and_man_page.patch +Patch402: coreutils-avoid_sizeof_charPP__static_analysis_warning.patch +Patch403: coreutils-also_deduplicate_virtual_file_systems.patch +Patch404: coreutils-fix_handling_of_symlinks_in_mount_list.patch +Patch405: coreutils-ignore_non_file_system_entries_in_proc_mounts.patch +Patch406: coreutils-avoid_clang_-Wtautological-constant-out-of-range-compare_warning.patch +Patch407: coreutils-use_the_last_device_name_provided_by_the_system.patch +Patch408: coreutils-avoid_compiler_warnings_with_some_assert_implementations.patch +Patch409: coreutils-use_all_of_the_last_device_details_provided.patch +Patch410: coreutils-output_placeholder_values_for_inaccessible_mount_points.patch +Patch411: coreutils-look_for_accessible_mount_points_for_specified_devices.patch +Patch412: coreutils-report_correct_device_in_presence_of_eclipsed_mounts.patch +Patch413: coreutils-avoid_an_inconsequential_mem_leak.patch + # ================================================ %description These are the GNU core utilities. This package is the union of @@ -187,6 +204,20 @@ the GNU fileutils, sh-utils, and textutils packages. %patch306 %patch307 +%patch401 -p1 +%patch402 -p1 +%patch403 -p1 +%patch404 -p1 +%patch405 -p1 +%patch406 -p1 +%patch407 -p1 +%patch408 -p1 +%patch409 -p1 +%patch410 -p1 +%patch411 -p1 +%patch412 -p1 +%patch413 -p1 + #???## We need to statically link to gmp, otherwise we have a build loop #???#sed -i s,'$(LIB_GMP)',%%{_libdir}/libgmp.a,g Makefile.in diff --git a/coreutils-use_all_of_the_last_device_details_provided.patch b/coreutils-use_all_of_the_last_device_details_provided.patch new file mode 100644 index 0000000..509b585 --- /dev/null +++ b/coreutils-use_all_of_the_last_device_details_provided.patch @@ -0,0 +1,97 @@ +commit 4f8d74eb1b2ba17ef05f81c1c725e60a65cf8293 +Author: Pádraig Brady +Date: Tue Jun 17 00:18:47 2014 +0100 + + df: use all of the last device details provided + + * src/df.c (filter_mount_list): Recent commit v8.22-108-g25a2c94 + failed to copy file system type along with the updated device name. + Therefore simply replace the existing mount entry with the + current one with all the latest device details. Note the name, + even if not shorter in this entry, will be replaced with a shorter + name in a subsequent mount entry. + * tests/df/skip-duplicates.sh: Add a test case. + +diff --git a/src/df.c b/src/df.c +index 747d138..10047ce 100644 +--- a/src/df.c ++++ b/src/df.c +@@ -642,7 +642,9 @@ filter_mount_list (void) + if ((strchr (me->me_devname, '/') + && ! strchr (devlist->me->me_devname, '/')) + || (strlen (devlist->me->me_mountdir) +- > strlen (me->me_mountdir))) ++ > strlen (me->me_mountdir)) ++ /* or one overmounted on a different device. */ ++ || ! STREQ (devlist->me->me_devname, me->me_devname)) + { + /* Discard mount entry for existing device. */ + discard_me = devlist->me; +@@ -652,17 +654,6 @@ filter_mount_list (void) + { + /* Discard mount entry currently being processed. */ + discard_me = me; +- +- /* We might still want the devname from this mount entry as +- the dev_num might not correlate with st_dev if another +- device is subsequently overmounted at mountdir, so honor +- the order of the presented list and replace with the +- latest devname encountered. */ +- if (! STREQ (devlist->me->me_devname, me->me_devname)) +- { +- free (devlist->me->me_devname); +- devlist->me->me_devname = xstrdup (me->me_devname); +- } + } + + } +diff --git a/tests/df/skip-duplicates.sh b/tests/df/skip-duplicates.sh +index 6fb6ff5..a620e73 100755 +--- a/tests/df/skip-duplicates.sh ++++ b/tests/df/skip-duplicates.sh +@@ -54,8 +54,8 @@ struct mntent *getmntent (FILE *fp) + {.mnt_fsname="fsname", .mnt_dir="/",}, + {.mnt_fsname="/fsname", .mnt_dir="/."}, + {.mnt_fsname="/fsname", .mnt_dir="/"}, +- {.mnt_fsname="virtfs", .mnt_dir="/NONROOT"}, +- {.mnt_fsname="virtfs2", .mnt_dir="/NONROOT"}, ++ {.mnt_fsname="virtfs", .mnt_dir="/NONROOT", .mnt_type="fstype1"}, ++ {.mnt_fsname="virtfs2", .mnt_dir="/NONROOT", .mnt_type="fstype2"}, + {.mnt_fsname="netns", .mnt_dir="net:[1234567]"}, + }; + +@@ -71,7 +71,8 @@ struct mntent *getmntent (FILE *fp) + + while (done++ <= 7) + { +- mntents[done-2].mnt_type = "-"; ++ if (!mntents[done-2].mnt_type) ++ mntents[done-2].mnt_type = "-"; + if (STREQ (mntents[done-2].mnt_dir, "/NONROOT")) + mntents[done-2].mnt_dir = nonroot_fs; + return &mntents[done-2]; +@@ -92,11 +93,11 @@ 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 unique entries. +-LD_PRELOAD=./k.so df >out || fail=1 ++LD_PRELOAD=./k.so df -T >out || fail=1 + test $(wc -l out && fail=1 ++LD_PRELOAD=./k.so CU_TEST_DUPE_INVALID=1 df -T >out && fail=1 + test $(wc -l out || fail=1 diff --git a/coreutils-use_the_last_device_name_provided_by_the_system.patch b/coreutils-use_the_last_device_name_provided_by_the_system.patch new file mode 100644 index 0000000..0fd019f --- /dev/null +++ b/coreutils-use_the_last_device_name_provided_by_the_system.patch @@ -0,0 +1,120 @@ +commit 25a2c948b24163ce0e0e9e52f6a5fef33d7d7842 +Author: Pádraig Brady +Date: Thu May 29 15:30:46 2014 +0100 + + df: use the last device name provided by the system + + The device name reported for a particular mount entry + may no longer be valid if the mount point was subsequently + mounted on a different device. Therefore honor the order + of the mount list returned by the system and use the last + reported device name. + + * src/df.c (filter_mount_list): When discarding the current + mount entry, ensure that a new device name is not also discarded. + * tests/df/skip-duplicates.sh: Add a test case. Also fix + a false failure in the edge case of a system with only a + single file system. + * NEWS: Mention the fix. + +--- + NEWS | 4 +++- + src/df.c | 22 +++++++++++++++++++--- + tests/df/skip-duplicates.sh | 13 +++++++++---- + 3 files changed, 31 insertions(+), 8 deletions(-) + +Index: coreutils-8.22/NEWS +=================================================================== +--- coreutils-8.22.orig/NEWS 2014-07-26 00:00:59.716631657 +0200 ++++ coreutils-8.22/NEWS 2014-07-26 00:01:35.008190452 +0200 +@@ -2,7 +2,9 @@ GNU coreutils NEWS + + Changes done after the release of 8.22 + +- df now correctly elides duplicates for virtual file systems like tmpfs. ++ df now elides duplicates for virtual file systems like tmpfs, and will ++ display the correct device name for directories mounted multiple times. ++ [These bugs were present in "the beginning".] + + Noteworthy changes in release 8.22 (2013-12-13) [stable] + +Index: coreutils-8.22/src/df.c +=================================================================== +--- coreutils-8.22.orig/src/df.c 2014-07-26 00:00:59.711631720 +0200 ++++ coreutils-8.22/src/df.c 2014-07-26 00:00:59.716631657 +0200 +@@ -604,7 +604,7 @@ excluded_fstype (const char *fstype) + } + + /* Filter mount list by skipping duplicate entries. +- In the case of duplicities - based on to the device number - the mount entry ++ In the case of duplicities - based on the device number - the mount entry + with a '/' in its me_devname (i.e. not pseudo name like tmpfs) wins. + If both have a real devname (e.g. bind mounts), then that with the shorter + me_mountdir wins. */ +@@ -638,17 +638,33 @@ filter_mount_list (void) + + if (devlist) + { +- discard_me = me; +- + /* ...let the shorter mountdir win. */ + if ((strchr (me->me_devname, '/') + && ! strchr (devlist->me->me_devname, '/')) + || (strlen (devlist->me->me_mountdir) + > strlen (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; ++ ++ /* We might still want the devname from this mount entry as ++ the dev_num might not correlate with st_dev if another ++ device is subsequently overmounted at mountdir, so honor ++ the order of the presented list and replace with the ++ latest devname encountered. */ ++ if (! STREQ (devlist->me->me_devname, me->me_devname)) ++ { ++ free (devlist->me->me_devname); ++ devlist->me->me_devname = xstrdup (me->me_devname); ++ } ++ } ++ + } + } + +Index: coreutils-8.22/tests/df/skip-duplicates.sh +=================================================================== +--- coreutils-8.22.orig/tests/df/skip-duplicates.sh 2014-07-26 00:00:59.706631782 +0200 ++++ coreutils-8.22/tests/df/skip-duplicates.sh 2014-07-26 00:00:59.716631657 +0200 +@@ -55,7 +55,7 @@ struct mntent *getmntent (FILE *fp) + {.mnt_fsname="/fsname", .mnt_dir="/."}, + {.mnt_fsname="/fsname", .mnt_dir="/"}, + {.mnt_fsname="virtfs", .mnt_dir="/NONROOT"}, +- {.mnt_fsname="virtfs", .mnt_dir="/NONROOT"}, ++ {.mnt_fsname="virtfs2", .mnt_dir="/NONROOT"}, + {.mnt_fsname="netns", .mnt_dir="net:[1234567]"}, + }; + +@@ -100,9 +100,14 @@ LD_PRELOAD=./k.so CU_TEST_DUPE_INVALID=1 + test $(wc -l out || fail=1 diff --git a/coreutils.changes b/coreutils.changes index 913e8db..e6eea80 100644 --- a/coreutils.changes +++ b/coreutils.changes @@ -1,3 +1,23 @@ +------------------------------------------------------------------- +Fri Jul 25 23:48:47 CEST 2014 - pth@suse.de + +- Incorporate 9 bugfixes, one documentation update and two maintenance + patches that won't harm (bnc#888215), See NEWS for specifics: + + coreutils-improve_df_--human_and_--si,_help_and_man_page.patch + coreutils-avoid_sizeof_charPP__static_analysis_warning.patch + coreutils-also_deduplicate_virtual_file_systems.patch + coreutils-fix_handling_of_symlinks_in_mount_list.patch + coreutils-ignore_non_file_system_entries_in_proc_mounts.patch + coreutils-avoid_clang_-Wtautological-constant-out-of-range-compare_warning.patch + coreutils-use_the_last_device_name_provided_by_the_system.patch + coreutils-avoid_compiler_warnings_with_some_assert_implementations.patch + coreutils-use_all_of_the_last_device_details_provided.patch + coreutils-output_placeholder_values_for_inaccessible_mount_points.patch + coreutils-look_for_accessible_mount_points_for_specified_devices.patch + coreutils-report_correct_device_in_presence_of_eclipsed_mounts.patch + coreutils-avoid_an_inconsequential_mem_leak.patch + ------------------------------------------------------------------- Sun Mar 16 20:38:48 UTC 2014 - mail@bernhard-voelker.de diff --git a/coreutils.spec b/coreutils.spec index cfd1fe1..4d56979 100644 --- a/coreutils.spec +++ b/coreutils.spec @@ -142,6 +142,23 @@ Patch306: coreutils-date-avoid-crash-in-TZ-parsing.patch # shuf --repeat no longer dumps core if the input is empty. Patch307: coreutils-shuf-repeat-avoid-crash-when-input-empty.patch +# These arte all upstream fixes that will be part of the upcoming 8.23 +# and can thus be removed on updating the package. + +Patch401: coreutils-improve_df_--human_and_--si,_help_and_man_page.patch +Patch402: coreutils-avoid_sizeof_charPP__static_analysis_warning.patch +Patch403: coreutils-also_deduplicate_virtual_file_systems.patch +Patch404: coreutils-fix_handling_of_symlinks_in_mount_list.patch +Patch405: coreutils-ignore_non_file_system_entries_in_proc_mounts.patch +Patch406: coreutils-avoid_clang_-Wtautological-constant-out-of-range-compare_warning.patch +Patch407: coreutils-use_the_last_device_name_provided_by_the_system.patch +Patch408: coreutils-avoid_compiler_warnings_with_some_assert_implementations.patch +Patch409: coreutils-use_all_of_the_last_device_details_provided.patch +Patch410: coreutils-output_placeholder_values_for_inaccessible_mount_points.patch +Patch411: coreutils-look_for_accessible_mount_points_for_specified_devices.patch +Patch412: coreutils-report_correct_device_in_presence_of_eclipsed_mounts.patch +Patch413: coreutils-avoid_an_inconsequential_mem_leak.patch + # ================================================ %description These are the GNU core utilities. This package is the union of @@ -187,6 +204,20 @@ the GNU fileutils, sh-utils, and textutils packages. %patch306 %patch307 +%patch401 -p1 +%patch402 -p1 +%patch403 -p1 +%patch404 -p1 +%patch405 -p1 +%patch406 -p1 +%patch407 -p1 +%patch408 -p1 +%patch409 -p1 +%patch410 -p1 +%patch411 -p1 +%patch412 -p1 +%patch413 -p1 + #???## We need to statically link to gmp, otherwise we have a build loop #???#sed -i s,'$(LIB_GMP)',%%{_libdir}/libgmp.a,g Makefile.in