diff --git a/coreutils-6.10-configuration.patch b/coreutils-6.10-configuration.patch index 4f52076..e2cf9cc 100644 --- a/coreutils-6.10-configuration.patch +++ b/coreutils-6.10-configuration.patch @@ -107,3 +107,38 @@ diff -urNp coreutils-8.4-orig/tests/touch/no-dereference coreutils-8.4/tests/tou # Changing time of dangling symlink is okay. # Skip the test if this fails, but the error text corresponds to +diff -urNp coreutils-8.12-orig/src/Makefile.am coreutils-8.12/src/Makefile.am +--- coreutils-8.12-orig/src/Makefile.am 2012-11-06 09:26:07.137152887 +0100 ++++ coreutils-8.12/src/Makefile.am 2012-11-06 09:27:02.778884576 +0100 +@@ -139,7 +139,7 @@ bin_PROGRAMS = $(OPTIONAL_BIN_PROGS) + + noinst_PROGRAMS = setuidgid getlimits + +-pkglib_PROGRAMS = $(OPTIONAL_PKGLIB_PROGS) ++pkglibexec_PROGRAMS = $(OPTIONAL_PKGLIB_PROGS) + + noinst_HEADERS = \ + chown-core.h \ +diff -urNp coreutils-8.12-orig/src/stdbuf.c coreutils-8.12/src/stdbuf.c +--- coreutils-8.12-orig/src/stdbuf.c 2011-02-19 22:28:53.000000000 +0100 ++++ coreutils-8.12/src/stdbuf.c 2012-11-06 09:28:24.504275850 +0100 +@@ -194,15 +194,14 @@ set_LD_PRELOAD (void) + char *LD_PRELOAD; + + /* Note this would auto add the appropriate search path for "libstdbuf.so": +- gcc stdbuf.c -Wl,-rpath,'$ORIGIN' -Wl,-rpath,$PKGLIBDIR ++ gcc stdbuf.c -Wl,-rpath,'$ORIGIN' -Wl,-rpath,$PKGLIBEXECDIR + However we want the lookup done for the exec'd command not stdbuf. + +- Since we don't link against libstdbuf.so add it to LIBDIR rather than +- LIBEXECDIR, as we'll search for it in the "sys default" case below. */ ++ Since we don't link against libstdbuf.so add it to PKGLIBEXECDIR ++ rather than to LIBDIR. */ + char const *const search_path[] = { + program_path, +- PKGLIBDIR, +- "", /* sys default */ ++ PKGLIBEXECDIR, + NULL + }; + diff --git a/coreutils-8.12-chown.patch b/coreutils-8.12-chown.patch new file mode 100644 index 0000000..679c949 --- /dev/null +++ b/coreutils-8.12-chown.patch @@ -0,0 +1,164 @@ +From 92625246f6c9614be5780a04eb227d6519becef5 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?P=C3=A1draig=20Brady?= +Date: Thu, 26 May 2011 11:15:11 +0100 +Subject: [PATCH] chown,chgrp: output the correct ownership in -v messages + +* src/chown_core.c (describe_change): Accept the ownership of +the original file and output that when not changing. +This is significant when --from is specified as then +the original and specified ownership may be different. +(user_group_str): A new helper function refactored from +describe_change(). +(change_file_owner): Pass the original user and group +strings to describe_change(). +* test/chown/basic: Add a test case. + +Signed-off-by: Kamil Dudka +--- + src/chown-core.c | 59 ++++++++++++++++++++++++++++++++++------------------ + tests/chown/basic | 11 +++++++++ + 2 files changed, 49 insertions(+), 21 deletions(-) + +diff --git a/src/chown-core.c b/src/chown-core.c +index 82f7341..e72aa33 100644 +--- a/src/chown-core.c ++++ b/src/chown-core.c +@@ -102,17 +102,44 @@ uid_to_name (uid_t uid) + : umaxtostr (uid, buf)); + } + ++/* Allocate a string representing USER and GROUP. */ ++ ++static char * ++user_group_str (char const *user, char const *group) ++{ ++ char *spec; ++ ++ if (user) ++ { ++ if (group) ++ { ++ spec = xmalloc (strlen (user) + 1 + strlen (group) + 1); ++ stpcpy (stpcpy (stpcpy (spec, user), ":"), group); ++ } ++ else ++ { ++ spec = xstrdup (user); ++ } ++ } ++ else ++ { ++ spec = xstrdup (group); ++ } ++ ++ return spec; ++} ++ + /* Tell the user how/if the user and group of FILE have been changed. + If USER is NULL, give the group-oriented messages. + CHANGED describes what (if anything) has happened. */ + + static void + describe_change (const char *file, enum Change_status changed, ++ char const *old_user, char const *old_group, + char const *user, char const *group) + { + const char *fmt; +- char const *spec; +- char *spec_allocated = NULL; ++ char *spec; + + if (changed == CH_NOT_APPLIED) + { +@@ -121,40 +148,25 @@ describe_change (const char *file, enum Change_status changed, + return; + } + +- if (user) +- { +- if (group) +- { +- spec_allocated = xmalloc (strlen (user) + 1 + strlen (group) + 1); +- stpcpy (stpcpy (stpcpy (spec_allocated, user), ":"), group); +- spec = spec_allocated; +- } +- else +- { +- spec = user; +- } +- } +- else +- { +- spec = group; +- } +- + switch (changed) + { + case CH_SUCCEEDED: + fmt = (user ? _("changed ownership of %s to %s\n") + : group ? _("changed group of %s to %s\n") + : _("no change to ownership of %s\n")); ++ spec = user_group_str (user, group); + break; + case CH_FAILED: + fmt = (user ? _("failed to change ownership of %s to %s\n") + : group ? _("failed to change group of %s to %s\n") + : _("failed to change ownership of %s\n")); ++ spec = user_group_str (user, group); + break; + case CH_NO_CHANGE_REQUESTED: + fmt = (user ? _("ownership of %s retained as %s\n") + : group ? _("group of %s retained as %s\n") + : _("ownership of %s retained\n")); ++ spec = user_group_str (user ? old_user : NULL, group ? old_group : NULL); + break; + default: + abort (); +@@ -162,7 +174,7 @@ describe_change (const char *file, enum Change_status changed, + + printf (fmt, quote (file), spec); + +- free (spec_allocated); ++ free (spec); + } + + /* Change the owner and/or group of the FILE to UID and/or GID (safely) +@@ -459,8 +471,13 @@ change_file_owner (FTS *fts, FTSENT *ent, + : !symlink_changed ? CH_NOT_APPLIED + : !changed ? CH_NO_CHANGE_REQUESTED + : CH_SUCCEEDED); ++ char *old_usr = file_stats ? uid_to_name (file_stats->st_uid) : NULL; ++ char *old_grp = file_stats ? gid_to_name (file_stats->st_gid) : NULL; + describe_change (file_full_name, ch_status, ++ old_usr, old_grp, + chopt->user_name, chopt->group_name); ++ free (old_usr); ++ free (old_grp); + } + } + +diff --git a/tests/chown/basic b/tests/chown/basic +index 0614f70..5626029 100755 +--- a/tests/chown/basic ++++ b/tests/chown/basic +@@ -27,6 +27,17 @@ chown -R --preserve-root 0:1 f + # Make sure the owner and group are 0 and 1 respectively. + set _ `ls -n f`; shift; test "$3:$4" = 0:1 || fail=1 + ++# Make sure the correct diagnostic is output ++# Note we output a name even though an id was specified. ++chown -v --from=42 43 f > out || fail=1 ++printf "ownership of \`f' retained as `id -nu`\n" > exp ++compare out exp || fail=1 ++ ++# Ensure diagnostics work for non existent files. ++chown -v 0 nf > out && fail=1 ++printf "failed to change ownership of \`nf' to 0\n" > exp ++compare out exp || fail=1 ++ + chown --from=0:1 2:010 f || fail=1 + + # And now they should be 2 and 10 respectively. +-- +1.7.1 + diff --git a/coreutils-8.12-lssymlinkacl.patch b/coreutils-8.12-lssymlinkacl.patch new file mode 100644 index 0000000..cb4f699 --- /dev/null +++ b/coreutils-8.12-lssymlinkacl.patch @@ -0,0 +1,59 @@ +diff -urNp coreutils-8.12-orig/lib/file-has-acl.c coreutils-8.12/lib/file-has-acl.c +--- coreutils-8.12-orig/lib/file-has-acl.c 2012-03-26 10:18:40.496707657 +0200 ++++ coreutils-8.12/lib/file-has-acl.c 2012-03-26 10:22:36.802430522 +0200 +@@ -322,6 +322,32 @@ acl_nontrivial (int count, struct acl *e + + #endif + ++/* acl_extended_file() tests whether a file has an ACL. But it can trigger ++ unnecessary autofs mounts. In newer versions of libacl, a function ++ acl_extended_file_nofollow() is available that uses lgetxattr() and ++ therefore does not have this problem. It is equivalent to ++ acl_extended_file(), except on symbolic links. */ ++ ++static int ++acl_extended_file_wrap (char const *name) ++{ ++ if ( ! HAVE_ACL_EXTENDED_FILE) ++ return -1; ++ ++ if (HAVE_ACL_EXTENDED_FILE_NOFOLLOW) ++ { ++ struct stat sb; ++ if (! lstat (name, &sb) && ! S_ISLNK (sb.st_mode)) ++ /* acl_extended_file_nofollow() uses lgetxattr() in order to ++ prevent unnecessary mounts. It returns the same result as ++ acl_extended_file() since we already know that NAME is not a ++ symbolic link at this point (modulo the TOCTTOU race condition). */ ++ return acl_extended_file_nofollow (name); ++ } ++ ++ /* fallback for symlinks and old versions of libacl */ ++ return acl_extended_file (name); ++} + + /* Return 1 if NAME has a nontrivial access control list, 0 if NAME + only has no or a base access control list, and -1 (setting errno) +@@ -339,20 +365,12 @@ file_has_acl (char const *name, struct s + /* Linux, FreeBSD, MacOS X, IRIX, Tru64 */ + int ret; + +- if (HAVE_ACL_EXTENDED_FILE || HAVE_ACL_EXTENDED_FILE_NOFOLLOW) /* Linux */ ++ if (HAVE_ACL_EXTENDED_FILE) /* Linux */ + { +-# if HAVE_ACL_EXTENDED_FILE_NOFOLLOW +- /* acl_extended_file_nofollow() uses lgetxattr() in order to prevent +- unnecessary mounts, but it returns the same result as we already +- know that NAME is not a symbolic link at this point (modulo the +- TOCTTOU race condition). */ +- ret = acl_extended_file_nofollow (name); +-# else + /* On Linux, acl_extended_file is an optimized function: It only + makes two calls to getxattr(), one for ACL_TYPE_ACCESS, one for + ACL_TYPE_DEFAULT. */ +- ret = acl_extended_file (name); +-# endif ++ ret = acl_extended_file_wrap (name); + } + else /* FreeBSD, MacOS X, IRIX, Tru64 */ + { diff --git a/coreutils-8.17-cp-freememoryread.patch b/coreutils-8.17-cp-freememoryread.patch new file mode 100644 index 0000000..be4a429 --- /dev/null +++ b/coreutils-8.17-cp-freememoryread.patch @@ -0,0 +1,29 @@ +diff -urNp coreutils-8.17-orig/src/extent-scan.c coreutils-8.17/src/extent-scan.c +--- coreutils-8.17-orig/src/extent-scan.c 2012-05-02 10:31:47.000000000 +0200 ++++ coreutils-8.17/src/extent-scan.c 2012-11-05 12:05:36.732370966 +0100 +@@ -89,7 +89,7 @@ extern bool + extent_scan_read (struct extent_scan *scan) + { + unsigned int si = 0; +- struct extent_info *last_ei IF_LINT ( = scan->ext_info); ++ struct extent_info *last_ei = scan->ext_info; + + while (true) + { +@@ -127,8 +127,14 @@ extent_scan_read (struct extent_scan *sc + + assert (scan->ei_count <= SIZE_MAX - fiemap->fm_mapped_extents); + scan->ei_count += fiemap->fm_mapped_extents; +- scan->ext_info = xnrealloc (scan->ext_info, scan->ei_count, +- sizeof (struct extent_info)); ++ { ++ /* last_ei points into a buffer that may be freed via xnrealloc. ++ Record its offset and adjust after allocation. */ ++ size_t prev_idx = last_ei - scan->ext_info; ++ scan->ext_info = xnrealloc (scan->ext_info, scan->ei_count, ++ sizeof (struct extent_info)); ++ last_ei = scan->ext_info + prev_idx; ++ } + + unsigned int i = 0; + for (i = 0; i < fiemap->fm_mapped_extents; i++) diff --git a/coreutils-8.17-df-duplicates.patch b/coreutils-8.17-df-duplicates.patch new file mode 100644 index 0000000..20c258e --- /dev/null +++ b/coreutils-8.17-df-duplicates.patch @@ -0,0 +1,387 @@ +diff -urNp coreutils-8.12-orig/doc/coreutils.texi coreutils-8.12/doc/coreutils.texi +--- coreutils-8.12-orig/doc/coreutils.texi 2011-04-25 10:55:27.000000000 +0200 ++++ coreutils-8.12/doc/coreutils.texi 2012-12-12 13:28:29.588025346 +0100 +@@ -10379,6 +10379,14 @@ Normally the disk space is printed in un + 1024 bytes, but this can be overridden (@pxref{Block size}). + Non-integer quantities are rounded up to the next higher unit. + ++For bind mounts and without arguments, @command{df} only outputs the statistics ++for the first occurence of that device in the list of file systems (@var{mtab}), ++i.e., it hides duplicate entries, unless the @option{-a} option is specified. ++ ++By default, @command{df} omits the early-boot pseudo file system type ++@samp{rootfs}, unless the @option{-a} option is specified or that file system ++type is explicitly to be included by using the @option{-t} option. ++ + @cindex disk device file + @cindex device file, disk + If an argument @var{file} is a disk device file containing a mounted +diff -urNp coreutils-8.12-orig/src/df.c coreutils-8.12/src/df.c +--- coreutils-8.12-orig/src/df.c 2011-04-25 11:45:49.000000000 +0200 ++++ coreutils-8.12/src/df.c 2012-12-12 13:28:29.593156345 +0100 +@@ -25,6 +25,7 @@ + #include + + #include "system.h" ++#include "canonicalize.h" + #include "error.h" + #include "fsusage.h" + #include "human.h" +@@ -45,6 +46,17 @@ + /* If true, show inode information. */ + static bool inode_format; + ++/* Filled with device numbers of examined file systems to avoid ++ duplicities in output. */ ++struct devlist ++{ ++ dev_t dev_num; ++ struct devlist *next; ++}; ++ ++/* Store of already-processed device numbers. */ ++static struct devlist *devlist_head; ++ + /* If true, show even file systems with zero size or + uninteresting types. */ + static bool show_all_fs; +@@ -56,6 +68,12 @@ static bool show_local_fs; + command line argument -- even if it's a dummy (automounter) entry. */ + static bool show_listed_fs; + ++/* If true, include rootfs in the output. */ ++static bool show_rootfs; ++ ++/* The literal name of the initial root file system. */ ++static char const *ROOTFS = "rootfs"; ++ + /* Human-readable options for output. */ + static int human_output_opts; + +@@ -349,6 +367,29 @@ excluded_fstype (const char *fstype) + return false; + } + ++/* Check if the device was already examined. */ ++ ++static bool ++dev_examined (char const *mount_dir, char const *devname) ++{ ++ struct stat buf; ++ if (-1 == stat (mount_dir, &buf)) ++ return false; ++ ++ struct devlist *devlist = devlist_head; ++ for ( ; devlist; devlist = devlist->next) ++ if (devlist->dev_num == buf.st_dev) ++ return true; ++ ++ /* Add the device number to the global list devlist. */ ++ devlist = xmalloc (sizeof *devlist); ++ devlist->dev_num = buf.st_dev; ++ devlist->next = devlist_head; ++ devlist_head = devlist; ++ ++ return false; ++} ++ + /* 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 +@@ -417,6 +458,17 @@ add_uint_with_neg_flag (uintmax_t *dest, + *dest = -*dest; + } + ++/* Return true if S ends in a string that may be a 36-byte UUID, ++ i.e., of the form HHHHHHHH-HHHH-HHHH-HHHH-HHHHHHHHHHHH, where ++ each H is an upper or lower case hexadecimal digit. */ ++static bool _GL_ATTRIBUTE_PURE ++has_uuid_suffix (char const *s) ++{ ++ size_t len = strlen (s); ++ return (36 < len ++ && strspn (s + len - 36, "-0123456789abcdefABCDEF") == 36); ++} ++ + /* Optain a space listing for the disk device with absolute file name DISK. + If MOUNT_POINT is non-NULL, it is the name of the root of the + file system on DISK. +@@ -428,13 +480,16 @@ add_uint_with_neg_flag (uintmax_t *dest, + If FSTYPE is non-NULL, it is the type of the file system on DISK. + If MOUNT_POINT is non-NULL, then DISK may be NULL -- certain systems may + not be able to produce statistics in this case. +- ME_DUMMY and ME_REMOTE are the mount entry flags. */ ++ ME_DUMMY and ME_REMOTE are the mount entry flags. ++ Caller must set PROCESS_ALL to true when iterating over all entries, as ++ when df is invoked with no non-option argument. See below for details. */ + + static void + get_dev (char const *disk, char const *mount_point, + char const *stat_file, char const *fstype, + bool me_dummy, bool me_remote, +- const struct fs_usage *force_fsu) ++ const struct fs_usage *force_fsu, ++ bool process_all) + { + struct fs_usage fsu; + char buf[LONGEST_HUMAN_READABLE + 2]; +@@ -459,6 +514,15 @@ get_dev (char const *disk, char const *m + if (!selected_fstype (fstype) || excluded_fstype (fstype)) + return; + ++ if (process_all && !show_all_fs && !show_listed_fs) ++ { ++ /* No arguments nor "df -a", then check if df has to ... */ ++ if (!show_rootfs && STREQ (disk, ROOTFS)) ++ return; /* ... skip rootfs: (unless -trootfs is given. */ ++ if (dev_examined (mount_point, disk)) ++ return; /* ... skip duplicate entries (bind mounts). */ ++ } ++ + /* 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, +@@ -488,6 +552,24 @@ get_dev (char const *disk, char const *m + + if (! disk) + disk = "-"; /* unknown */ ++ ++ char *dev_name = xstrdup (disk); ++ char *resolved_dev; ++ ++ /* On some systems, dev_name is a long-named symlink like ++ /dev/disk/by-uuid/828fc648-9f30-43d8-a0b1-f7196a2edb66 pointing to a ++ much shorter and more useful name like /dev/sda1. It may also look ++ like /dev/mapper/luks-828fc648-9f30-43d8-a0b1-f7196a2edb66 and point to ++ /dev/dm-0. When process_all is true and dev_name is a symlink whose ++ name ends with a UUID use the resolved name instead. */ ++ if (process_all ++ && has_uuid_suffix (dev_name) ++ && (resolved_dev = canonicalize_filename_mode (dev_name, CAN_EXISTING))) ++ { ++ free (dev_name); ++ dev_name = resolved_dev; ++ } ++ + if (! fstype) + fstype = "-"; /* unknown */ + +@@ -537,7 +619,7 @@ get_dev (char const *disk, char const *m + switch (field) + { + case DEV_FIELD: +- cell = xstrdup (disk); ++ cell = dev_name; + break; + + case TYPE_FIELD: +@@ -648,7 +730,7 @@ get_disk (char const *disk) + { + get_dev (best_match->me_devname, best_match->me_mountdir, NULL, + best_match->me_type, best_match->me_dummy, +- best_match->me_remote, NULL); ++ best_match->me_remote, NULL, false); + return true; + } + +@@ -734,7 +816,7 @@ get_point (const char *point, const stru + if (best_match) + get_dev (best_match->me_devname, best_match->me_mountdir, point, + best_match->me_type, best_match->me_dummy, best_match->me_remote, +- NULL); ++ NULL, false); + else + { + /* We couldn't find the mount entry corresponding to POINT. Go ahead and +@@ -745,7 +827,7 @@ get_point (const char *point, const stru + char *mp = find_mount_point (point, statp); + if (mp) + { +- get_dev (NULL, mp, NULL, NULL, false, false, NULL); ++ get_dev (NULL, mp, NULL, NULL, false, false, NULL, false); + free (mp); + } + } +@@ -774,7 +856,7 @@ get_all_entries (void) + + for (me = mount_list; me; me = me->me_next) + get_dev (me->me_devname, me->me_mountdir, NULL, me->me_type, +- me->me_dummy, me->me_remote, NULL); ++ me->me_dummy, me->me_remote, NULL, true); + } + + /* Add FSTYPE to the list of file system types to display. */ +@@ -940,6 +1022,7 @@ main (int argc, char **argv) + /* Accept -F as a synonym for -t for compatibility with Solaris. */ + case 't': + add_fs_type (optarg); ++ show_rootfs = selected_fstype (ROOTFS); + break; + + case 'v': /* For SysV compatibility. */ +@@ -1066,13 +1149,21 @@ main (int argc, char **argv) + { + if (inode_format) + grand_fsu.fsu_blocks = 1; +- get_dev ("total", NULL, NULL, NULL, false, false, &grand_fsu); ++ get_dev ("total", NULL, NULL, NULL, false, false, &grand_fsu, false); + } + + print_table (); + + if (! file_systems_processed) + error (EXIT_FAILURE, 0, _("no file systems processed")); ++ IF_LINT ( ++ while (devlist_head) ++ { ++ struct devlist *devlist = devlist_head->next; ++ free (devlist_head); ++ devlist_head = devlist; ++ } ++ ); + + exit (exit_status); + } +diff -urNp coreutils-8.12-orig/tests/df/skip-duplicates coreutils-8.12/tests/df/skip-duplicates +--- coreutils-8.12-orig/tests/df/skip-duplicates 1970-01-01 01:00:00.000000000 +0100 ++++ coreutils-8.12/tests/df/skip-duplicates 2012-12-12 13:28:29.590144032 +0100 +@@ -0,0 +1,77 @@ ++#!/bin/sh ++# 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 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=.}/init.sh"; path_prepend_ ../src ++print_ver_ df ++ ++df || skip_ "df fails" ++ ++# Simulate an mtab file with two entries of the same device number. ++cat > k.c <<'EOF' || framework_failure_ ++#include ++#include ++ ++struct mntent *getmntent (FILE *fp) ++{ ++ /* Prove that LD_PRELOAD works. */ ++ static int done = 0; ++ if (!done) ++ { ++ fclose (fopen ("x", "w")); ++ ++done; ++ } ++ ++ static struct mntent mntent; ++ ++ while (done++ < 3) ++ { ++ mntent.mnt_fsname = "fsname"; ++ mntent.mnt_dir = "/"; ++ mntent.mnt_type = "-"; ++ ++ return &mntent; ++ } ++ return NULL; ++} ++EOF ++ ++# Then compile/link it: ++gcc --std=gnu99 -shared -fPIC -ldl -O2 k.c -o k.so \ ++ || skip_ "getmntent hack does not work on this platform" ++ ++# Test if LD_PRELOAD works: ++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 2 entries, both ++# 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 || fail=1 ++test $(wc -l out || fail=1 ++test $(wc -l . ++ ++. "${srcdir=.}/init.sh"; path_prepend_ ../src ++print_ver_ df ++ ++df || skip_ "df fails" ++ ++# Verify that rootfs is in mtab (and shown when the -a option is specified). ++df -a >out || fail=1 ++grep '^rootfs' out || skip_ "no rootfs in mtab" ++ ++# Ensure that rootfs is supressed when no options is specified. ++df >out || fail=1 ++grep '^rootfs' out && { fail=1; cat out; } ++ ++# Ensure that the rootfs is shown when explicitly specifying "-t rootfs". ++df -t rootfs >out || fail=1 ++grep '^rootfs' out || { fail=1; cat out; } ++ ++# Ensure that the rootfs is shown when explicitly specifying "-t rootfs", ++# even when the -a option is specified. ++df -t rootfs -a >out || fail=1 ++grep '^rootfs' out || { fail=1; cat out; } ++ ++# Ensure that the rootfs is omitted in all_fs mode when it is explicitly ++# black-listed. ++df -a -x rootfs >out || fail=1 ++grep '^rootfs' out && { fail=1; cat out; } ++ ++Exit $fail +diff -urNp coreutils-8.12-orig/tests/Makefile.am coreutils-8.12/tests/Makefile.am +--- coreutils-8.12-orig/tests/Makefile.am 2011-04-25 11:45:27.000000000 +0200 ++++ coreutils-8.12/tests/Makefile.am 2012-12-12 13:28:29.592155734 +0100 +@@ -352,6 +352,8 @@ TESTS = \ + cp/symlink-slash \ + cp/thru-dangling \ + df/unreadable \ ++ df/skip-duplicates \ ++ df/skip-rootfs \ + dd/direct \ + dd/misc \ + dd/nocache \ diff --git a/coreutils-8.2-uname-processortype.patch b/coreutils-8.2-uname-processortype.patch index 166520d..4c83df8 100644 --- a/coreutils-8.2-uname-processortype.patch +++ b/coreutils-8.2-uname-processortype.patch @@ -16,7 +16,7 @@ diff -urNp coreutils-8.2-orig/src/uname.c coreutils-8.2/src/uname.c } +#else + { -+ struct utsname u; ++ static struct utsname u; + uname(&u); + element = u.machine; + } @@ -38,7 +38,7 @@ diff -urNp coreutils-8.2-orig/src/uname.c coreutils-8.2/src/uname.c } +#else + { -+ struct utsname u; ++ static struct utsname u; + uname(&u); + element = u.machine; + if(strlen(element)==4 && element[0]=='i' && element[2]=='8' && element[3]=='6') diff --git a/coreutils-8.5-pam.patch b/coreutils-8.5-pam.patch index 71b85e7..8a924b2 100644 --- a/coreutils-8.5-pam.patch +++ b/coreutils-8.5-pam.patch @@ -106,7 +106,7 @@ index f8f5b61..811aad7 100644 static struct option const longopts[] = { {"command", required_argument, NULL, 'c'}, -@@ -200,7 +224,164 @@ log_su (struct passwd const *pw, bool successful) +@@ -200,7 +224,174 @@ log_su (struct passwd const *pw, bool successful) } #endif @@ -168,7 +168,7 @@ index f8f5b61..811aad7 100644 +create_watching_parent (void) +{ + pid_t child; -+ sigset_t ourset; ++ sigset_t ourset, blockset; + int status = 0; + + retval = pam_open_session (pamh, 0); @@ -230,7 +230,17 @@ index f8f5b61..811aad7 100644 + + if (pid != (pid_t)-1 && WIFSTOPPED (status)) + { ++ /* tcsh sends SIGTSTP to the process group, and so is already pending */ + kill (getpid (), SIGSTOP); ++ if (WSTOPSIG(status) != SIGSTOP) { ++ sigemptyset(&blockset); ++ if (sigaddset(&blockset, WSTOPSIG(status)) || ++ sigprocmask(SIG_UNBLOCK, &blockset, &ourset) || ++ sigprocmask(SIG_SETMASK, &ourset, NULL)) ++ { ++ error (0, errno, _("cannot set signal handler")); ++ } ++ } + /* once we get here, we must have resumed */ + kill (pid, SIGCONT); + } @@ -271,7 +281,7 @@ index f8f5b61..811aad7 100644 Return true if the user gives the correct password for entry PW, false if not. Return true without asking for a password if run by UID 0 or if PW has an empty password. */ -@@ -208,10 +389,52 @@ log_su (struct passwd const *pw, bool successful) +@@ -208,10 +399,52 @@ log_su (struct passwd const *pw, bool successful) static bool correct_password (const struct passwd *pw) { @@ -325,7 +335,7 @@ index f8f5b61..811aad7 100644 endspent (); if (sp) -@@ -232,6 +455,7 @@ correct_password (const struct passwd *pw) +@@ -232,6 +465,7 @@ correct_password (const struct passwd *pw) encrypted = crypt (unencrypted, correct); memset (unencrypted, 0, strlen (unencrypted)); return STREQ (encrypted, correct); @@ -333,7 +343,7 @@ index f8f5b61..811aad7 100644 } /* Update `environ' for the new shell based on PW, with SHELL being -@@ -274,19 +498,41 @@ modify_environment (const struct passwd *pw, const char *shell) +@@ -274,19 +508,41 @@ modify_environment (const struct passwd *pw, const char *shell) } } } @@ -377,7 +387,7 @@ index f8f5b61..811aad7 100644 if (setgid (pw->pw_gid)) error (EXIT_CANCELED, errno, _("cannot set group id")); if (setuid (pw->pw_uid)) -@@ -500,9 +746,21 @@ main (int argc, char **argv) +@@ -500,9 +756,21 @@ main (int argc, char **argv) shell = NULL; } shell = xstrdup (shell ? shell : pw->pw_shell); diff --git a/coreutils-acl-extended-file-nofollow.patch b/coreutils-acl-extended-file-nofollow.patch new file mode 100644 index 0000000..ad72293 --- /dev/null +++ b/coreutils-acl-extended-file-nofollow.patch @@ -0,0 +1,74 @@ +From 95f7c57ff4090a5dee062044d2c7b99879077808 Mon Sep 17 00:00:00 2001 +From: Kamil Dudka redhat.com> +Date: Fri, 22 Jul 2011 14:48:42 +0200 +Subject: [PATCH] file-has-acl: use acl_extended_file_nofollow if available + +* lib/acl-internal.h (HAVE_ACL_EXTENDED_FILE): New macro. +(acl_extended_file): New macro. +* lib/file-has-acl.c (file_has_acl): Use acl_extended_file_nofollow. +* m4/acl.m4 (gl_FUNC_ACL): Check for acl_extended_file_nofollow. +This addresses http://bugzilla.redhat.com/692823. +--- + lib/acl-internal.h | 6 ++++++ + lib/file-has-acl.c | 10 +++++++++- + m4/acl.m4 | 2 +- + 3 files changed, 16 insertions(+), 2 deletions(-) + +diff --git a/lib/acl-internal.h b/lib/acl-internal.h +index b3160a7..b509666 100644 +--- a/lib/acl-internal.h ++++ b/lib/acl-internal.h +@@ -133,6 +133,12 @@ rpl_acl_set_fd (int fd, acl_t acl) + # endif + + /* Linux-specific */ ++# ifndef HAVE_ACL_EXTENDED_FILE_NOFOLLOW ++# define HAVE_ACL_EXTENDED_FILE_NOFOLLOW false ++# define acl_extended_file_nofollow(name) (-1) ++# endif ++ ++/* Linux-specific */ + # ifndef HAVE_ACL_FROM_MODE + # define HAVE_ACL_FROM_MODE false + # define acl_from_mode(mode) (NULL) +diff --git a/lib/file-has-acl.c b/lib/file-has-acl.c +index 3d4d5c1..2ee6ba2 100644 +--- a/lib/file-has-acl.c ++++ b/lib/file-has-acl.c +@@ -366,12 +366,20 @@ file_has_acl (char const *name, struct stat const *sb) + /* Linux, FreeBSD, MacOS X, IRIX, Tru64 */ + int ret; + +- if (HAVE_ACL_EXTENDED_FILE) /* Linux */ ++ if (HAVE_ACL_EXTENDED_FILE || HAVE_ACL_EXTENDED_FILE_NOFOLLOW) /* Linux */ + { ++# if HAVE_ACL_EXTENDED_FILE_NOFOLLOW ++ /* acl_extended_file_nofollow() uses lgetxattr() in order to prevent ++ unnecessary mounts, but it returns the same result as we already ++ know that NAME is not a symbolic link at this point (modulo the ++ TOCTTOU race condition). */ ++ ret = acl_extended_file_nofollow (name); ++# else + /* On Linux, acl_extended_file is an optimized function: It only + makes two calls to getxattr(), one for ACL_TYPE_ACCESS, one for + ACL_TYPE_DEFAULT. */ + ret = acl_extended_file (name); ++# endif + } + else /* FreeBSD, MacOS X, IRIX, Tru64 */ + { +diff --git a/m4/acl.m4 b/m4/acl.m4 +index d6a448a..ecf0384 100644 +--- a/m4/acl.m4 ++++ b/m4/acl.m4 +@@ -33,7 +33,7 @@ AC_DEFUN([gl_FUNC_ACL], + AC_CHECK_FUNCS( + [acl_get_file acl_get_fd acl_set_file acl_set_fd \ + acl_free acl_from_mode acl_from_text \ +- acl_delete_def_file acl_extended_file \ ++ acl_delete_def_file acl_extended_file acl_extended_file_nofollow \ + acl_delete_fd_np acl_delete_file_np \ + acl_copy_ext_native acl_create_entry_np \ + acl_to_short_text acl_free_text]) +-- +1.7.6.586.g302e6 diff --git a/coreutils-colorls.csh b/coreutils-colorls.csh index 7e3d794..a8b9d57 100755 --- a/coreutils-colorls.csh +++ b/coreutils-colorls.csh @@ -1,4 +1,3 @@ -#! /bin/csh -f # color-ls initialization if ( $?USER_LS_COLORS ) then if ( "$USER_LS_COLORS" != "" ) then @@ -15,12 +14,12 @@ if ($?TERM) then if ( -e "/etc/DIR_COLORS.$TERM" ) then set COLORS="/etc/DIR_COLORS.$TERM" endif -endif -if ( -e "/etc/DIR_COLORS.256color" ) then - if ( "`tty -s && tput colors`" == "256" ) then - set COLORS=/etc/DIR_COLORS.256color + if ( -e "/etc/DIR_COLORS.256color" ) then + if ( "`tput colors`" == "256" ) then + set COLORS=/etc/DIR_COLORS.256color endif endif +endif if ( -f ~/.dircolors ) set COLORS=~/.dircolors if ( -f ~/.dir_colors ) set COLORS=~/.dir_colors if ($?TERM) then diff --git a/coreutils-df-direct.patch b/coreutils-df-direct.patch index 025323d..d242ffc 100644 --- a/coreutils-df-direct.patch +++ b/coreutils-df-direct.patch @@ -67,7 +67,7 @@ diff -urNp coreutils-8.11-orig/src/df.c coreutils-8.11/src/df.c + char *resolved = canonicalize_file_name (name); + if (resolved) + { -+ get_dev (NULL, resolved, NULL, NULL, false, false, NULL); ++ get_dev (NULL, resolved, NULL, NULL, false, false, NULL, false); + free (resolved); + return; + } diff --git a/coreutils-i18n.patch b/coreutils-i18n.patch index 6e10f37..043f72b 100644 --- a/coreutils-i18n.patch +++ b/coreutils-i18n.patch @@ -1,6 +1,6 @@ -diff -urNp coreutils-8.10-orig/lib/linebuffer.h coreutils-8.10/lib/linebuffer.h ---- coreutils-8.10-orig/lib/linebuffer.h 2011-01-06 09:47:56.000000000 +0100 -+++ coreutils-8.10/lib/linebuffer.h 2011-02-04 20:13:23.985464731 +0100 +diff -urNp coreutils-8.12-orig/lib/linebuffer.h coreutils-8.12/lib/linebuffer.h +--- coreutils-8.12-orig/lib/linebuffer.h 2011-04-24 19:21:45.000000000 +0200 ++++ coreutils-8.12/lib/linebuffer.h 2012-03-26 10:10:44.383439379 +0200 @@ -21,6 +21,11 @@ # include @@ -23,9 +23,9 @@ diff -urNp coreutils-8.10-orig/lib/linebuffer.h coreutils-8.10/lib/linebuffer.h }; /* Initialize linebuffer LINEBUFFER for use. */ -diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c ---- coreutils-8.10-orig/src/cut.c 2011-01-31 13:40:38.000000000 +0100 -+++ coreutils-8.10/src/cut.c 2011-02-04 20:13:23.988464025 +0100 +diff -urNp coreutils-8.12-orig/src/cut.c coreutils-8.12/src/cut.c +--- coreutils-8.12-orig/src/cut.c 2011-02-19 18:17:03.000000000 +0100 ++++ coreutils-8.12/src/cut.c 2012-03-26 10:10:44.385806690 +0200 @@ -28,6 +28,11 @@ #include #include @@ -75,7 +75,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c + while (0) + +/* Get wide character on BUFPOS. BUFPOS is not included after that. -+ If byte sequence is not valid as a character, CONVFAIL is 1. Otherwise 0. */ ++ If byte sequence is not valid as a character, CONVFAIL is 1. Otherwise 0. */ +#define GET_NEXT_WC_FROM_BUFFER(WC, BUFPOS, BUFLEN, MBLENGTH, STATE, CONVFAIL) \ + do \ + { \ @@ -226,7 +226,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c } max_range_endpoint = 0; -@@ -580,6 +662,63 @@ cut_bytes (FILE *stream) +@@ -582,6 +664,77 @@ cut_bytes (FILE *stream) } } @@ -234,11 +234,11 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c +/* This function is in use for the following case. + + 1. Read from the stream STREAM, printing to standard output any selected -+ characters. ++ characters. + + 2. Read from stream STREAM, printing to standard output any selected bytes, + without splitting multibyte characters. */ -+ ++ +static void +cut_characters_or_cut_bytes_no_split (FILE *stream) +{ @@ -251,6 +251,9 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c + as same character as WC. */ + mbstate_t state; /* State of the stream. */ + int convfail = 0; /* 1, when conversion is failed. Otherwise 0. */ ++ /* Whether to begin printing delimiters between ranges for the current line. ++ Set after we've begun printing data corresponding to the first range. */ ++ bool print_delimiter = false; + + idx = 0; + buflen = 0; @@ -273,12 +276,23 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c + { + putchar ('\n'); + idx = 0; ++ print_delimiter = false; + } + else + { ++ bool range_start; ++ bool *rs = output_delimiter_specified ? &range_start : NULL; + idx += (operating_mode == byte_mode) ? mblength : 1; -+ if (print_kth (idx, NULL)) -+ fwrite (bufpos, mblength, sizeof(char), stdout); ++ if (print_kth (idx, rs)) ++ { ++ if (rs && *rs && print_delimiter) ++ { ++ fwrite (output_delimiter_string, sizeof (char), ++ output_delimiter_length, stdout); ++ } ++ print_delimiter = true; ++ fwrite (bufpos, mblength, sizeof(char), stdout); ++ } + } + + buflen -= mblength; @@ -286,11 +300,11 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c + } +} +#endif -+ ++ /* Read from stream STREAM, printing to standard output any selected fields. */ static void -@@ -702,13 +841,192 @@ cut_fields (FILE *stream) +@@ -704,13 +857,195 @@ cut_fields (FILE *stream) } } @@ -310,7 +324,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c + size_t mblength; /* The byte size of a multibyte character which shows + as same character as WC. */ + mbstate_t state; /* State of the stream. */ -+ int convfail; /* 1, when conversion is failed. Otherwise 0. */ ++ int convfail = 0; /* 1, when conversion is failed. Otherwise 0. */ + + found_any_selected_field = 0; + field_idx = 1; @@ -321,7 +335,10 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c + c = getc (stream); + empty_input = (c == EOF); + if (c != EOF) ++ { + ungetc (c, stream); ++ wc = 0; ++ } + else + wc = WEOF; + @@ -359,7 +376,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c + break; + } + -+ if (wc == WEOF) ++ if (len<=0 && wc == WEOF) + break; + + /* If the first field extends to the end of line (it is not @@ -486,7 +503,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c } /* Process file FILE to standard output. -@@ -760,6 +1078,8 @@ main (int argc, char **argv) +@@ -762,6 +1097,8 @@ main (int argc, char **argv) bool ok; bool delim_specified = false; char *spec_list_string IF_LINT ( = NULL); @@ -495,7 +512,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c initialize_main (&argc, &argv); set_program_name (argv[0]); -@@ -782,7 +1102,6 @@ main (int argc, char **argv) +@@ -784,7 +1121,6 @@ main (int argc, char **argv) switch (optc) { case 'b': @@ -503,7 +520,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c /* Build the byte list. */ if (operating_mode != undefined_mode) FATAL_ERROR (_("only one type of list may be specified")); -@@ -790,6 +1109,14 @@ main (int argc, char **argv) +@@ -792,6 +1128,14 @@ main (int argc, char **argv) spec_list_string = optarg; break; @@ -518,7 +535,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c case 'f': /* Build the field list. */ if (operating_mode != undefined_mode) -@@ -801,10 +1128,35 @@ main (int argc, char **argv) +@@ -803,10 +1147,35 @@ main (int argc, char **argv) case 'd': /* New delimiter. */ /* Interpret -d '' to mean `use the NUL byte as the delimiter.' */ @@ -558,7 +575,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c break; case OUTPUT_DELIMITER_OPTION: -@@ -817,6 +1169,7 @@ main (int argc, char **argv) +@@ -819,6 +1188,7 @@ main (int argc, char **argv) break; case 'n': @@ -566,7 +583,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c break; case 's': -@@ -839,7 +1192,7 @@ main (int argc, char **argv) +@@ -841,7 +1211,7 @@ main (int argc, char **argv) if (operating_mode == undefined_mode) FATAL_ERROR (_("you must specify a list of bytes, characters, or fields")); @@ -575,7 +592,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c FATAL_ERROR (_("an input delimiter may be specified only\ when operating on fields")); -@@ -866,15 +1219,34 @@ main (int argc, char **argv) +@@ -868,15 +1238,34 @@ main (int argc, char **argv) } if (!delim_specified) @@ -607,7 +624,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c + if (MB_CUR_MAX <= 1 || force_singlebyte_mode) +#endif + { -+ static char dummy[2]; ++ static char dummy[2]; + dummy[0] = delim; + dummy[1] = '\0'; + output_delimiter_string = dummy; @@ -616,9 +633,9 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c } if (optind == argc) -diff -urNp coreutils-8.10-orig/src/expand.c coreutils-8.10/src/expand.c ---- coreutils-8.10-orig/src/expand.c 2011-01-31 13:40:38.000000000 +0100 -+++ coreutils-8.10/src/expand.c 2011-02-04 20:13:23.990463571 +0100 +diff -urNp coreutils-8.12-orig/src/expand.c coreutils-8.12/src/expand.c +--- coreutils-8.12-orig/src/expand.c 2011-02-19 18:17:03.000000000 +0100 ++++ coreutils-8.12/src/expand.c 2012-03-26 10:10:44.386455034 +0200 @@ -38,12 +38,29 @@ #include #include @@ -716,7 +733,7 @@ diff -urNp coreutils-8.10-orig/src/expand.c coreutils-8.10/src/expand.c + if (convert) + { + ++column; -+ if (convert_entire_line == 0) ++ if (convert_entire_line == 0 && !isblank(*bufpos)) + convert = 0; + } + putchar (*bufpos); @@ -776,7 +793,7 @@ diff -urNp coreutils-8.10-orig/src/expand.c coreutils-8.10/src/expand.c + + width = wcwidth (wc); + column += (width > 0) ? width : 0; -+ if (convert_entire_line == 0) ++ if (convert_entire_line == 0 && !iswblank(wc)) + convert = 0; + } + } @@ -806,9 +823,9 @@ diff -urNp coreutils-8.10-orig/src/expand.c coreutils-8.10/src/expand.c if (have_read_stdin && fclose (stdin) != 0) error (EXIT_FAILURE, errno, "-"); -diff -urNp coreutils-8.10-orig/src/fold.c coreutils-8.10/src/fold.c ---- coreutils-8.10-orig/src/fold.c 2011-01-31 13:40:38.000000000 +0100 -+++ coreutils-8.10/src/fold.c 2011-02-04 20:13:23.992463115 +0100 +diff -urNp coreutils-8.12-orig/src/fold.c coreutils-8.12/src/fold.c +--- coreutils-8.12-orig/src/fold.c 2011-02-19 18:17:03.000000000 +0100 ++++ coreutils-8.12/src/fold.c 2012-03-26 10:10:44.388464872 +0200 @@ -22,12 +22,34 @@ #include #include @@ -1067,7 +1084,7 @@ diff -urNp coreutils-8.10-orig/src/fold.c coreutils-8.10/src/fold.c + fwrite (line_out, sizeof(char), offset_out, stdout); + START_NEW_LINE; + continue; -+ ++ + case L'\b': + increment = (column > 0) ? -1 : 0; + break; @@ -1179,7 +1196,7 @@ diff -urNp coreutils-8.10-orig/src/fold.c coreutils-8.10/src/fold.c if (ferror (istream)) { error (0, saved_errno, "%s", filename); -@@ -254,7 +502,8 @@ main (int argc, char **argv) +@@ -254,7 +501,8 @@ main (int argc, char **argv) atexit (close_stdout); @@ -1189,7 +1206,7 @@ diff -urNp coreutils-8.10-orig/src/fold.c coreutils-8.10/src/fold.c while ((optc = getopt_long (argc, argv, shortopts, longopts, NULL)) != -1) { -@@ -263,7 +512,15 @@ main (int argc, char **argv) +@@ -263,7 +511,15 @@ main (int argc, char **argv) switch (optc) { case 'b': /* Count bytes rather than columns. */ @@ -1206,9 +1223,9 @@ diff -urNp coreutils-8.10-orig/src/fold.c coreutils-8.10/src/fold.c break; case 's': /* Break at word boundaries. */ -diff -urNp coreutils-8.10-orig/src/join.c coreutils-8.10/src/join.c ---- coreutils-8.10-orig/src/join.c 2011-01-31 13:40:38.000000000 +0100 -+++ coreutils-8.10/src/join.c 2011-02-04 20:20:15.985114387 +0100 +diff -urNp coreutils-8.12-orig/src/join.c coreutils-8.12/src/join.c +--- coreutils-8.12-orig/src/join.c 2011-02-19 18:17:03.000000000 +0100 ++++ coreutils-8.12/src/join.c 2012-03-26 10:10:44.390449445 +0200 @@ -22,18 +22,32 @@ #include #include @@ -1423,7 +1440,7 @@ diff -urNp coreutils-8.10-orig/src/join.c coreutils-8.10/src/join.c + extract_field (line, ptr, lim - ptr); +} +#endif -+ ++ static void freeline (struct line *line) { @@ -1551,7 +1568,7 @@ diff -urNp coreutils-8.10-orig/src/join.c coreutils-8.10/src/join.c - return xmemcoll (beg1, len1, beg2, len2); - diff = memcmp (beg1, beg2, MIN (len1, len2)); + copy[0] = (unsigned char *) beg[0]; -+ copy[1] = (unsigned char *) beg[1]; ++ copy[1] = (unsigned char *) beg[1]; } + if (hard_LC_COLLATE) @@ -1632,7 +1649,7 @@ diff -urNp coreutils-8.10-orig/src/join.c coreutils-8.10/src/join.c case 't': { - unsigned char newtab = optarg[0]; -+ char *newtab; ++ char *newtab = NULL; + size_t newtablen; + newtab = xstrdup (optarg); +#if HAVE_MBRTOWC @@ -1653,8 +1670,9 @@ diff -urNp coreutils-8.10-orig/src/join.c coreutils-8.10/src/join.c +#endif + newtablen = 1; if (! newtab) +- newtab = '\n'; /* '' => process the whole line. */ + { - newtab = '\n'; /* '' => process the whole line. */ ++ newtab = "\n"; /* '' => process the whole line. */ + } else if (optarg[1]) { @@ -1683,9 +1701,9 @@ diff -urNp coreutils-8.10-orig/src/join.c coreutils-8.10/src/join.c break; case NOCHECK_ORDER_OPTION: -diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c ---- coreutils-8.10-orig/src/pr.c 2011-01-31 13:40:38.000000000 +0100 -+++ coreutils-8.10/src/pr.c 2011-02-04 20:13:24.002460897 +0100 +diff -urNp coreutils-8.12-orig/src/pr.c coreutils-8.12/src/pr.c +--- coreutils-8.12-orig/src/pr.c 2011-04-25 11:45:49.000000000 +0200 ++++ coreutils-8.12/src/pr.c 2012-03-26 10:10:44.394824042 +0200 @@ -312,6 +312,32 @@ #include @@ -1963,7 +1981,19 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c if (*arg) { long int tmp_long; -@@ -1249,7 +1375,7 @@ init_parameters (int number_of_files) +@@ -1212,6 +1338,11 @@ static void + init_parameters (int number_of_files) + { + int chars_used_by_number = 0; ++ int mb_len = 1; ++#if HAVE_MBRTOWC ++ if (MB_CUR_MAX > 1) ++ mb_len = MB_LEN_MAX; ++#endif + + lines_per_body = lines_per_page - lines_per_header - lines_per_footer; + if (lines_per_body <= 0) +@@ -1249,7 +1380,7 @@ init_parameters (int number_of_files) else col_sep_string = column_separator; @@ -1972,7 +2002,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c use_col_separator = true; } /* It's rather pointless to define a TAB separator with column -@@ -1280,11 +1406,11 @@ init_parameters (int number_of_files) +@@ -1280,11 +1411,11 @@ init_parameters (int number_of_files) TAB_WIDTH (chars_per_input_tab, chars_per_number); */ /* Estimate chars_per_text without any margin and keep it constant. */ @@ -1986,7 +2016,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c /* The number is part of the column width unless we are printing files in parallel. */ -@@ -1299,7 +1425,7 @@ init_parameters (int number_of_files) +@@ -1299,7 +1430,7 @@ init_parameters (int number_of_files) } chars_per_column = (chars_per_line - chars_used_by_number - @@ -1995,7 +2025,16 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c if (chars_per_column < 1) error (EXIT_FAILURE, 0, _("page width too narrow")); -@@ -1424,7 +1550,7 @@ init_funcs (void) +@@ -1316,7 +1447,7 @@ init_parameters (int number_of_files) + We've to use 8 as the lower limit, if we use chars_per_default_tab = 8 + to expand a tab which is not an input_tab-char. */ + free (clump_buff); +- clump_buff = xmalloc (MAX (8, chars_per_input_tab)); ++ clump_buff = xmalloc (mb_len * MAX (8, chars_per_input_tab)); + } + + /* Open the necessary files, +@@ -1424,7 +1555,7 @@ init_funcs (void) /* Enlarge p->start_position of first column to use the same form of padding_not_printed with all columns. */ @@ -2004,7 +2043,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c /* This loop takes care of all but the rightmost column. */ -@@ -1458,7 +1584,7 @@ init_funcs (void) +@@ -1458,7 +1589,7 @@ init_funcs (void) } else { @@ -2013,7 +2052,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c h_next = h + chars_per_column; } } -@@ -1749,9 +1875,9 @@ static void +@@ -1749,9 +1880,9 @@ static void align_column (COLUMN *p) { padding_not_printed = p->start_position; @@ -2025,7 +2064,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c padding_not_printed = ANYWHERE; } -@@ -2022,13 +2148,13 @@ store_char (char c) +@@ -2022,13 +2153,13 @@ store_char (char c) /* May be too generous. */ buff = X2REALLOC (buff, &buff_allocated); } @@ -2041,7 +2080,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c char *s; int left_cut; -@@ -2051,22 +2177,24 @@ add_line_number (COLUMN *p) +@@ -2051,22 +2182,24 @@ add_line_number (COLUMN *p) /* Tabification is assumed for multiple columns, also for n-separators, but `default n-separator = TAB' hasn't been given priority over equal column_width also specified by POSIX. */ @@ -2070,7 +2109,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c output_position = POS_AFTER_TAB (chars_per_output_tab, output_position); } -@@ -2227,7 +2355,7 @@ print_white_space (void) +@@ -2227,7 +2360,7 @@ print_white_space (void) while (goal - h_old > 1 && (h_new = POS_AFTER_TAB (chars_per_output_tab, h_old)) <= goal) { @@ -2079,7 +2118,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c h_old = h_new; } while (++h_old <= goal) -@@ -2247,6 +2375,7 @@ print_sep_string (void) +@@ -2247,6 +2380,7 @@ print_sep_string (void) { char *s; int l = col_sep_length; @@ -2087,7 +2126,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c s = col_sep_string; -@@ -2260,6 +2389,7 @@ print_sep_string (void) +@@ -2260,6 +2394,7 @@ print_sep_string (void) { for (; separators_not_printed > 0; --separators_not_printed) { @@ -2095,7 +2134,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c while (l-- > 0) { /* 3 types of sep_strings: spaces only, spaces and chars, -@@ -2273,12 +2403,15 @@ print_sep_string (void) +@@ -2273,12 +2408,15 @@ print_sep_string (void) } else { @@ -2112,7 +2151,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c /* sep_string ends with some spaces */ if (spaces_not_printed > 0) print_white_space (); -@@ -2306,7 +2439,7 @@ print_clump (COLUMN *p, int n, char *clu +@@ -2306,7 +2444,7 @@ print_clump (COLUMN *p, int n, char *clu required number of tabs and spaces. */ static void @@ -2121,7 +2160,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c { if (tabify_output) { -@@ -2330,6 +2463,74 @@ print_char (char c) +@@ -2330,6 +2468,74 @@ print_char (char c) putchar (c); } @@ -2196,7 +2235,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c /* Skip to page PAGE before printing. PAGE may be larger than total number of pages. */ -@@ -2509,9 +2710,9 @@ read_line (COLUMN *p) +@@ -2509,9 +2715,9 @@ read_line (COLUMN *p) align_empty_cols = false; } @@ -2208,7 +2247,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c padding_not_printed = ANYWHERE; } -@@ -2612,9 +2813,9 @@ print_stored (COLUMN *p) +@@ -2612,9 +2818,9 @@ print_stored (COLUMN *p) } } @@ -2220,7 +2259,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c padding_not_printed = ANYWHERE; } -@@ -2627,8 +2828,8 @@ print_stored (COLUMN *p) +@@ -2627,8 +2833,8 @@ print_stored (COLUMN *p) if (spaces_not_printed == 0) { output_position = p->start_position + end_vector[line]; @@ -2231,7 +2270,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c } return true; -@@ -2647,7 +2848,7 @@ print_stored (COLUMN *p) +@@ -2647,7 +2853,7 @@ print_stored (COLUMN *p) number of characters is 1.) */ static int @@ -2240,7 +2279,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c { unsigned char uc = c; char *s = clump_buff; -@@ -2657,10 +2858,10 @@ char_to_clump (char c) +@@ -2657,10 +2863,10 @@ char_to_clump (char c) int chars; int chars_per_c = 8; @@ -2253,7 +2292,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c { width = TAB_WIDTH (chars_per_c, input_position); -@@ -2741,6 +2942,154 @@ char_to_clump (char c) +@@ -2741,6 +2947,154 @@ char_to_clump (char c) return chars; } @@ -2298,7 +2337,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c + width = +4; + chars = +4; + *s++ = '\\'; -+ sprintf (esc_buff, "%03o", mbc[0]); ++ sprintf (esc_buff, "%03o", (unsigned char) mbc[0]); + for (i = 0; i <= 2; ++i) + *s++ = (int) esc_buff[i]; + } @@ -2347,7 +2386,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c + width += 4; + chars += 4; + *s++ = '\\'; -+ sprintf (esc_buff, "%03o", c); ++ sprintf (esc_buff, "%03o", (unsigned char) mbc[i]); + for (j = 0; j <= 2; ++j) + *s++ = (int) esc_buff[j]; + } @@ -2368,7 +2407,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c + width += 4; + chars += 4; + *s++ = '\\'; -+ sprintf (esc_buff, "%03o", c); ++ sprintf (esc_buff, "%03o", (unsigned char) mbc[i]); + for (j = 0; j <= 2; ++j) + *s++ = (int) esc_buff[j]; + } @@ -2408,9 +2447,9 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c /* We've just printed some files and need to clean up things before looking for more options and printing the next batch of files. -diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c ---- coreutils-8.10-orig/src/sort.c 2011-02-03 11:24:35.000000000 +0100 -+++ coreutils-8.10/src/sort.c 2011-02-04 20:15:44.160384535 +0100 +diff -urNp coreutils-8.12-orig/src/sort.c coreutils-8.12/src/sort.c +--- coreutils-8.12-orig/src/sort.c 2011-04-25 11:45:49.000000000 +0200 ++++ coreutils-8.12/src/sort.c 2012-03-26 10:12:38.009431063 +0200 @@ -22,11 +22,20 @@ #include @@ -2432,7 +2471,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c #include "system.h" #include "argmatch.h" #include "error.h" -@@ -163,12 +172,34 @@ static int thousands_sep; +@@ -167,12 +176,34 @@ static int thousands_sep; /* Nonzero if the corresponding locales are hard. */ static bool hard_LC_COLLATE; @@ -2468,7 +2507,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c /* The kind of blanks for '-b' to skip in various options. */ enum blanktype { bl_start, bl_end, bl_both }; -@@ -335,13 +366,11 @@ static bool reverse; +@@ -343,13 +374,11 @@ static bool reverse; they were read if all keys compare equal. */ static bool stable; @@ -2485,7 +2524,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c /* Flag to remove consecutive duplicate lines from the output. Only the last of a sequence of equal lines will be output. */ -@@ -775,6 +804,46 @@ reap_all (void) +@@ -783,6 +812,46 @@ reap_all (void) reap (-1); } @@ -2532,7 +2571,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c /* Clean up any remaining temporary files. */ static void -@@ -1207,7 +1276,7 @@ zaptemp (char const *name) +@@ -1215,7 +1284,7 @@ zaptemp (char const *name) free (node); } @@ -2541,7 +2580,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c static int struct_month_cmp (void const *m1, void const *m2) -@@ -1222,7 +1291,7 @@ struct_month_cmp (void const *m1, void c +@@ -1230,7 +1299,7 @@ struct_month_cmp (void const *m1, void c /* Initialize the character class tables. */ static void @@ -2550,7 +2589,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c { size_t i; -@@ -1234,7 +1303,7 @@ inittables (void) +@@ -1242,7 +1311,7 @@ inittables (void) fold_toupper[i] = toupper (i); } @@ -2559,7 +2598,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c /* If we're not in the "C" locale, read different names for months. */ if (hard_LC_TIME) { -@@ -1316,6 +1385,84 @@ specify_nmerge (int oi, char c, char con +@@ -1324,6 +1393,84 @@ specify_nmerge (int oi, char c, char con xstrtol_fatal (e, oi, c, long_options, s); } @@ -2644,7 +2683,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c /* Specify the amount of main memory to use when sorting. */ static void specify_sort_size (int oi, char c, char const *s) -@@ -1544,7 +1691,7 @@ buffer_linelim (struct buffer const *buf +@@ -1552,7 +1699,7 @@ buffer_linelim (struct buffer const *buf by KEY in LINE. */ static char * @@ -2653,7 +2692,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c { char *ptr = line->text, *lim = ptr + line->length - 1; size_t sword = key->sword; -@@ -1553,10 +1700,10 @@ begfield (struct line const *line, struc +@@ -1561,10 +1708,10 @@ begfield (struct line const *line, struc /* The leading field separator itself is included in a field when -t is absent. */ @@ -2666,7 +2705,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c ++ptr; if (ptr < lim) ++ptr; -@@ -1582,11 +1729,70 @@ begfield (struct line const *line, struc +@@ -1590,11 +1737,70 @@ begfield (struct line const *line, struc return ptr; } @@ -2738,7 +2777,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c { char *ptr = line->text, *lim = ptr + line->length - 1; size_t eword = key->eword, echar = key->echar; -@@ -1601,10 +1807,10 @@ limfield (struct line const *line, struc +@@ -1609,10 +1815,10 @@ limfield (struct line const *line, struc `beginning' is the first character following the delimiting TAB. Otherwise, leave PTR pointing at the first `blank' character after the preceding field. */ @@ -2751,7 +2790,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c ++ptr; if (ptr < lim && (eword || echar)) ++ptr; -@@ -1650,10 +1856,10 @@ limfield (struct line const *line, struc +@@ -1658,10 +1864,10 @@ limfield (struct line const *line, struc */ /* Make LIM point to the end of (one byte past) the current field. */ @@ -2764,7 +2803,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c if (newlim) lim = newlim; } -@@ -1684,6 +1890,130 @@ limfield (struct line const *line, struc +@@ -1692,6 +1898,130 @@ limfield (struct line const *line, struc return ptr; } @@ -2895,7 +2934,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c /* Fill BUF reading from FP, moving buf->left bytes from the end of buf->buf to the beginning first. If EOF is reached and the file wasn't terminated by a newline, supply one. Set up BUF's line -@@ -1770,8 +2100,22 @@ fillbuf (struct buffer *buf, FILE *fp, c +@@ -1778,8 +2108,22 @@ fillbuf (struct buffer *buf, FILE *fp, c else { if (key->skipsblanks) @@ -2920,7 +2959,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c line->keybeg = line_start; } } -@@ -1892,7 +2236,7 @@ human_numcompare (char const *a, char co +@@ -1900,7 +2244,7 @@ human_numcompare (char const *a, char co hideously fast. */ static int @@ -2929,7 +2968,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c { while (blanks[to_uchar (*a)]) a++; -@@ -1902,6 +2246,25 @@ numcompare (char const *a, char const *b +@@ -1910,6 +2254,25 @@ numcompare (char const *a, char const *b return strnumcmp (a, b, decimal_point, thousands_sep); } @@ -2955,7 +2994,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c static int general_numcompare (char const *sa, char const *sb) { -@@ -1934,7 +2297,7 @@ general_numcompare (char const *sa, char +@@ -1942,7 +2305,7 @@ general_numcompare (char const *sa, char Return 0 if the name in S is not recognized. */ static int @@ -2964,7 +3003,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c { size_t lo = 0; size_t hi = MONTHS_PER_YEAR; -@@ -2209,15 +2572,14 @@ debug_key (struct line const *line, stru +@@ -2217,15 +2580,14 @@ debug_key (struct line const *line, stru char saved = *lim; *lim = '\0'; @@ -2982,7 +3021,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c else if (key->general_numeric) ignore_value (strtold (beg, &tighter_lim)); else if (key->numeric || key->human_numeric) -@@ -2361,7 +2723,7 @@ key_warnings (struct keyfield const *gke +@@ -2369,7 +2731,7 @@ key_warnings (struct keyfield const *gke bool maybe_space_aligned = !hard_LC_COLLATE && default_key_compare (key) && !(key->schar || key->echar); bool line_offset = key->eword == 0 && key->echar != 0; /* -k1.x,1.y */ @@ -2991,7 +3030,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c && ((!key->skipsblanks && !(implicit_skip || maybe_space_aligned)) || (!key->skipsblanks && key->schar) || (!key->skipeblanks && key->echar))) -@@ -2419,11 +2781,83 @@ key_warnings (struct keyfield const *gke +@@ -2427,11 +2789,83 @@ key_warnings (struct keyfield const *gke error (0, 0, _("option `-r' only applies to last-resort comparison")); } @@ -3057,12 +3096,12 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c + } + while (hi - lo > 1); + -+ if (ea) -+ *ea = (char *) month; -+ + result = (!strncmp (month, monthtab[lo].name, strlen (monthtab[lo].name)) + ? monthtab[lo].val : 0); + ++ if (ea && result) ++ *ea = s + strlen (monthtab[lo].name); ++ + return result; +} +#endif @@ -3076,7 +3115,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c { struct keyfield *key = keylist; -@@ -2508,7 +2942,7 @@ keycompare (struct line const *a, struct +@@ -2516,7 +2950,7 @@ keycompare (struct line const *a, struct else if (key->human_numeric) diff = human_numcompare (ta, tb); else if (key->month) @@ -3085,7 +3124,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c else if (key->random) diff = compare_random (ta, tlena, tb, tlenb); else if (key->version) -@@ -2624,6 +3058,179 @@ keycompare (struct line const *a, struct +@@ -2632,6 +3066,180 @@ keycompare (struct line const *a, struct return key->reverse ? -diff : diff; } @@ -3167,7 +3206,8 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c + if (MBLENGTH == (size_t)-2 || MBLENGTH == (size_t)-1) \ + STATE = state_bak; \ + if (!ignore) \ -+ COPY[NEW_LEN++] = TEXT[i++]; \ ++ COPY[NEW_LEN++] = TEXT[i]; \ ++ i++; \ + continue; \ + } \ + \ @@ -3265,7 +3305,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c /* Compare two lines A and B, returning negative, zero, or positive depending on whether A compares less than, equal to, or greater than B. */ -@@ -4087,7 +4694,7 @@ main (int argc, char **argv) +@@ -4095,7 +4703,7 @@ main (int argc, char **argv) initialize_exit_failure (SORT_FAILURE); hard_LC_COLLATE = hard_locale (LC_COLLATE); @@ -3274,7 +3314,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c hard_LC_TIME = hard_locale (LC_TIME); #endif -@@ -4108,6 +4715,29 @@ main (int argc, char **argv) +@@ -4116,6 +4724,29 @@ main (int argc, char **argv) thousands_sep = -1; } @@ -3304,7 +3344,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c have_read_stdin = false; inittables (); -@@ -4378,13 +5008,34 @@ main (int argc, char **argv) +@@ -4386,13 +5017,34 @@ main (int argc, char **argv) case 't': { @@ -3343,7 +3383,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c else { /* Provoke with `sort -txx'. Complain about -@@ -4395,9 +5046,12 @@ main (int argc, char **argv) +@@ -4403,9 +5055,12 @@ main (int argc, char **argv) quote (optarg)); } } @@ -3358,9 +3398,9 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c } break; -diff -urNp coreutils-8.10-orig/src/unexpand.c coreutils-8.10/src/unexpand.c ---- coreutils-8.10-orig/src/unexpand.c 2011-01-31 13:40:38.000000000 +0100 -+++ coreutils-8.10/src/unexpand.c 2011-02-04 20:13:24.015458014 +0100 +diff -urNp coreutils-8.12-orig/src/unexpand.c coreutils-8.12/src/unexpand.c +--- coreutils-8.12-orig/src/unexpand.c 2011-02-19 18:17:03.000000000 +0100 ++++ coreutils-8.12/src/unexpand.c 2012-03-26 10:10:44.401556558 +0200 @@ -39,12 +39,29 @@ #include #include @@ -3614,9 +3654,9 @@ diff -urNp coreutils-8.10-orig/src/unexpand.c coreutils-8.10/src/unexpand.c if (have_read_stdin && fclose (stdin) != 0) error (EXIT_FAILURE, errno, "-"); -diff -urNp coreutils-8.10-orig/src/uniq.c coreutils-8.10/src/uniq.c ---- coreutils-8.10-orig/src/uniq.c 2011-01-31 13:40:38.000000000 +0100 -+++ coreutils-8.10/src/uniq.c 2011-02-04 20:13:24.018457349 +0100 +diff -urNp coreutils-8.12-orig/src/uniq.c coreutils-8.12/src/uniq.c +--- coreutils-8.12-orig/src/uniq.c 2011-04-25 11:45:49.000000000 +0200 ++++ coreutils-8.12/src/uniq.c 2012-03-26 10:10:44.403559433 +0200 @@ -21,6 +21,16 @@ #include #include @@ -3671,7 +3711,7 @@ diff -urNp coreutils-8.10-orig/src/uniq.c coreutils-8.10/src/uniq.c static char * -find_field (struct linebuffer const *line) -+find_field_uni (struct linebuffer *line) ++find_field_uni (struct linebuffer const *line) { size_t count; char const *lp = line->buffer; @@ -3725,7 +3765,7 @@ diff -urNp coreutils-8.10-orig/src/uniq.c coreutils-8.10/src/uniq.c + while (pos < size) + { + MBCHAR_TO_WCHAR (wc, mblength, lp, pos, size, statep, convfail); -+ ++ + if (convfail || !iswblank (wc)) + { + pos += mblength; @@ -3952,7 +3992,7 @@ diff -urNp coreutils-8.10-orig/src/uniq.c coreutils-8.10/src/uniq.c match = !different (thisfield, prevfield, thislen, prevlen); match_count += match; -@@ -383,6 +612,9 @@ check_file (const char *infile, const ch +@@ -383,6 +611,9 @@ check_file (const char *infile, const ch SWAP_LINES (prevline, thisline); prevfield = thisfield; prevlen = thislen; @@ -3962,7 +4002,7 @@ diff -urNp coreutils-8.10-orig/src/uniq.c coreutils-8.10/src/uniq.c if (!match) match_count = 0; } -@@ -428,6 +660,19 @@ main (int argc, char **argv) +@@ -428,6 +659,19 @@ main (int argc, char **argv) atexit (close_stdout); @@ -3982,10 +4022,10 @@ diff -urNp coreutils-8.10-orig/src/uniq.c coreutils-8.10/src/uniq.c skip_chars = 0; skip_fields = 0; check_chars = SIZE_MAX; -diff -urNp coreutils-8.10-orig/tests/Makefile.am coreutils-8.10/tests/Makefile.am ---- coreutils-8.10-orig/tests/Makefile.am 2011-02-04 20:12:58.236173903 +0100 -+++ coreutils-8.10/tests/Makefile.am 2011-02-04 20:13:24.020456905 +0100 -@@ -235,6 +235,7 @@ TESTS = \ +diff -urNp coreutils-8.12-orig/tests/Makefile.am coreutils-8.12/tests/Makefile.am +--- coreutils-8.12-orig/tests/Makefile.am 2012-03-26 10:10:12.786431587 +0200 ++++ coreutils-8.12/tests/Makefile.am 2012-03-26 10:10:44.404540015 +0200 +@@ -236,6 +236,7 @@ TESTS = \ misc/sort-debug-keys \ misc/sort-debug-warn \ misc/sort-files0-from \ @@ -3993,7 +4033,7 @@ diff -urNp coreutils-8.10-orig/tests/Makefile.am coreutils-8.10/tests/Makefile.a misc/sort-float \ misc/sort-merge \ misc/sort-merge-fdlimit \ -@@ -505,6 +506,10 @@ TESTS = \ +@@ -511,6 +512,10 @@ TESTS = \ $(root_tests) pr_data = \ @@ -4004,9 +4044,9 @@ diff -urNp coreutils-8.10-orig/tests/Makefile.am coreutils-8.10/tests/Makefile.a pr/0F \ pr/0FF \ pr/0FFnt \ -diff -urNp coreutils-8.10-orig/tests/misc/cut coreutils-8.10/tests/misc/cut ---- coreutils-8.10-orig/tests/misc/cut 2011-01-31 13:40:38.000000000 +0100 -+++ coreutils-8.10/tests/misc/cut 2011-02-04 20:13:24.021456684 +0100 +diff -urNp coreutils-8.12-orig/tests/misc/cut coreutils-8.12/tests/misc/cut +--- coreutils-8.12-orig/tests/misc/cut 2011-02-07 09:25:51.000000000 +0100 ++++ coreutils-8.12/tests/misc/cut 2012-03-26 10:10:44.405558576 +0200 @@ -26,7 +26,7 @@ use strict; my $prog = 'cut'; my $try = "Try \`$prog --help' for more information.\n"; @@ -4025,41 +4065,41 @@ diff -urNp coreutils-8.10-orig/tests/misc/cut coreutils-8.10/tests/misc/cut ['inval2', qw(-f -), {IN=>''}, {OUT=>''}, {EXIT=>1}, {ERR=>$no_endpoint}], ['inval3', '-f', '4,-', {IN=>''}, {OUT=>''}, {EXIT=>1}, {ERR=>$no_endpoint}], ['inval4', '-f', '1-2,-', {IN=>''}, {OUT=>''}, {EXIT=>1}, -diff -urNp coreutils-8.10-orig/tests/misc/mb1.I coreutils-8.10/tests/misc/mb1.I ---- coreutils-8.10-orig/tests/misc/mb1.I 1970-01-01 01:00:00.000000000 +0100 -+++ coreutils-8.10/tests/misc/mb1.I 2011-02-04 20:13:24.022456462 +0100 +diff -urNp coreutils-8.12-orig/tests/misc/mb1.I coreutils-8.12/tests/misc/mb1.I +--- coreutils-8.12-orig/tests/misc/mb1.I 1970-01-01 01:00:00.000000000 +0100 ++++ coreutils-8.12/tests/misc/mb1.I 2012-03-26 10:10:44.406556899 +0200 @@ -0,0 +1,4 @@ +Apple@10 +Banana@5 +Citrus@20 +Cherry@30 -diff -urNp coreutils-8.10-orig/tests/misc/mb1.X coreutils-8.10/tests/misc/mb1.X ---- coreutils-8.10-orig/tests/misc/mb1.X 1970-01-01 01:00:00.000000000 +0100 -+++ coreutils-8.10/tests/misc/mb1.X 2011-02-04 20:13:24.023456240 +0100 +diff -urNp coreutils-8.12-orig/tests/misc/mb1.X coreutils-8.12/tests/misc/mb1.X +--- coreutils-8.12-orig/tests/misc/mb1.X 1970-01-01 01:00:00.000000000 +0100 ++++ coreutils-8.12/tests/misc/mb1.X 2012-03-26 10:10:44.406556899 +0200 @@ -0,0 +1,4 @@ +Banana@5 +Apple@10 +Citrus@20 +Cherry@30 -diff -urNp coreutils-8.10-orig/tests/misc/mb2.I coreutils-8.10/tests/misc/mb2.I ---- coreutils-8.10-orig/tests/misc/mb2.I 1970-01-01 01:00:00.000000000 +0100 -+++ coreutils-8.10/tests/misc/mb2.I 2011-02-04 20:13:24.024456019 +0100 +diff -urNp coreutils-8.12-orig/tests/misc/mb2.I coreutils-8.12/tests/misc/mb2.I +--- coreutils-8.12-orig/tests/misc/mb2.I 1970-01-01 01:00:00.000000000 +0100 ++++ coreutils-8.12/tests/misc/mb2.I 2012-03-26 10:10:44.407556588 +0200 @@ -0,0 +1,4 @@ +Apple@AA10@@20 +Banana@AA5@@30 +Citrus@AA20@@5 +Cherry@AA30@@10 -diff -urNp coreutils-8.10-orig/tests/misc/mb2.X coreutils-8.10/tests/misc/mb2.X ---- coreutils-8.10-orig/tests/misc/mb2.X 1970-01-01 01:00:00.000000000 +0100 -+++ coreutils-8.10/tests/misc/mb2.X 2011-02-04 20:13:24.024456019 +0100 +diff -urNp coreutils-8.12-orig/tests/misc/mb2.X coreutils-8.12/tests/misc/mb2.X +--- coreutils-8.12-orig/tests/misc/mb2.X 1970-01-01 01:00:00.000000000 +0100 ++++ coreutils-8.12/tests/misc/mb2.X 2012-03-26 10:10:44.407556588 +0200 @@ -0,0 +1,4 @@ +Citrus@AA20@@5 +Cherry@AA30@@10 +Apple@AA10@@20 +Banana@AA5@@30 -diff -urNp coreutils-8.10-orig/tests/misc/sort-mb-tests coreutils-8.10/tests/misc/sort-mb-tests ---- coreutils-8.10-orig/tests/misc/sort-mb-tests 1970-01-01 01:00:00.000000000 +0100 -+++ coreutils-8.10/tests/misc/sort-mb-tests 2011-02-04 20:13:24.025455797 +0100 +diff -urNp coreutils-8.12-orig/tests/misc/sort-mb-tests coreutils-8.12/tests/misc/sort-mb-tests +--- coreutils-8.12-orig/tests/misc/sort-mb-tests 1970-01-01 01:00:00.000000000 +0100 ++++ coreutils-8.12/tests/misc/sort-mb-tests 2012-03-26 10:10:44.408558435 +0200 @@ -0,0 +1,58 @@ +#! /bin/sh +case $# in @@ -4079,7 +4119,7 @@ diff -urNp coreutils-8.10-orig/tests/misc/sort-mb-tests coreutils-8.10/tests/mis +$xx -t @ -k2 -n misc/mb1.I > misc/mb1.O +code=$? +if test $code != 0; then -+ $echo "Test mb1 failed: $xx return code $code differs from expected value 0" 1>&2 ++ $echo "Test mb1 failed: $xx return code $code differs from expected value 0" + errors=`expr $errors + 1` +else + cmp misc/mb1.O $srcdir/misc/mb1.X > /dev/null 2>&1 diff --git a/coreutils-su.pamd b/coreutils-su.pamd index 1981f58..030657f 100644 --- a/coreutils-su.pamd +++ b/coreutils-su.pamd @@ -4,7 +4,7 @@ auth sufficient pam_rootok.so #auth sufficient pam_wheel.so trust use_uid # Uncomment the following line to require a user to be in the "wheel" group. #auth required pam_wheel.so use_uid -auth include system-auth +auth substack system-auth auth include postlogin account sufficient pam_succeed_if.so uid = 0 use_uid quiet account include system-auth diff --git a/coreutils.spec b/coreutils.spec index 2784cdc..703abd5 100644 --- a/coreutils.spec +++ b/coreutils.spec @@ -1,7 +1,7 @@ Summary: A set of basic GNU tools commonly used in shell scripts Name: coreutils Version: 8.12 -Release: 2%{?dist} +Release: 9%{?dist} License: GPLv3+ Group: System Environment/Base Url: http://www.gnu.org/software/coreutils/ @@ -18,6 +18,9 @@ Source202: coreutils-su-l.pamd Source203: coreutils-runuser-l.pamd # From upstream +Patch1: coreutils-8.12-chown.patch +Patch2: coreutils-8.17-cp-freememoryread.patch +Patch3: coreutils-8.17-df-duplicates.patch # Our patches #general patch to workaround koji build system issues @@ -32,6 +35,8 @@ Patch103: coreutils-8.2-uname-processortype.patch Patch104: coreutils-df-direct.patch #add note about mkdir --mode behaviour into info documentation(#610559) Patch107: coreutils-8.4-mkdir-modenote.patch +#use acl_extended_file_nofollow if available (#692823) +Patch108: coreutils-acl-extended-file-nofollow.patch # sh-utils #add info about TZ envvar to date manpage @@ -57,6 +62,9 @@ Patch908: coreutils-getgrouplist.patch Patch912: coreutils-overflow.patch #compile su with pie flag and RELRO protection Patch917: coreutils-8.4-su-pie.patch +#fix rshowing ls ACLs with acl_extended_file_nofollow +Patch918: coreutils-8.12-lssymlinkacl.patch + #SELINUX Patch - implements Redhat changes #(upstream did some SELinux implementation unlike with RedHat patch) @@ -80,7 +88,7 @@ Requires(pre): /sbin/install-info Requires(preun): /sbin/install-info Requires(post): /sbin/install-info Requires(post): grep -%{?!nopam:Requires: pam } +%{?!nopam:Requires: pam >= 1.1.3-7} Requires: ncurses Requires: gmp Requires: %{name}-libs = %{version}-%{release} @@ -91,6 +99,7 @@ Provides: stat = %{version}-%{release} Provides: textutils = %{version}-%{release} #old mktemp package had epoch 3, so we have to use 4 for coreutils Provides: mktemp = 4:%{version}-%{release} +Provides: bundled(gnulib) Obsoletes: mktemp < 4:%{version}-%{release} Obsoletes: fileutils <= 4.1.9 Obsoletes: sh-utils <= 2.0.12 @@ -113,6 +122,9 @@ Libraries for coreutils package. %setup -q # From upstream +%patch1 -p1 -b .chown +%patch2 -p1 -b .cpfmr +%patch3 -p1 -b .duplic # Our patches %patch100 -p1 -b .configure @@ -121,6 +133,7 @@ Libraries for coreutils package. %patch103 -p1 -b .sysinfo %patch104 -p1 -b .dfdirect %patch107 -p1 -b .mkdirmode +%patch108 -p1 -b .nofollow # sh-utils %patch703 -p1 -b .dateman @@ -142,7 +155,10 @@ Libraries for coreutils package. %patch950 -p1 -b .selinux %patch951 -p1 -b .selinuxman -chmod a+x tests/misc/sort-mb-tests tests/df/direct || : +#later applied +%patch918 -p1 -b .aclsymlink + +chmod a+x tests/misc/sort-mb-tests tests/df/direct tests/chown/basic || : #fix typos/mistakes in localized documentation(#439410, #440056) find ./po/ -name "*.p*" | xargs \ @@ -326,9 +342,45 @@ fi %files libs %defattr(-, root, root, -) -%{_libdir}/coreutils +%{_libexecdir}/coreutils %changelog +* Wed Dec 12 2012 Ondrej Vasik - 8.12-9 +- fix showing duplicates in df (#709351, O.Oprala, B.Voelker) +- df: work around long-named /dev/disk/by-uuid/... symlinks + +* Mon Nov 05 2012 Ondrej Vasik - 8.12-8 +- fix support for ecryptfs mount of "Private" in su (#722323) +- cp: avoid data-corrupting free-memory-read (upstream fix) +- multibyte fixes in cut and expand (by M.Briza, #821260) +- fix the tcsh colorls.csh behaviour in non-interactive + mode (#804604) +- add virtual provides for bundled(gnulib) copylib (#821748) + +* Mon Mar 26 2012 Ondrej Vasik - 8.12-7 +- fix sort segfault with multibyte locales (by P.Brady) +- fix showing ACLs in ls (#805398, caused by #692823 fix) + +* Mon Jan 30 2012 Kamil Dudka - 8.12-6 +- do not use shebang in sourced colorls.csh +- su: fix shell suspend in tcsh (#597928) +- variable "u" should be static in uname processor type patch +- various multibyte patch fixes: + - fix cut output-delimiter option + - prevent infinite loop in sort when ignoring chars + - prevent using unitialized variable in cut + - fix pr -c and pr -v segfault with multibyte locales + - fix stack smashing, buffer overflow and invalid output of pr (#772172) + +* Sun Jan 29 2012 Kamil Dudka - 8.12-5 +- output the correct ownership in chown -v (upstream bug #10636) + +* Mon Oct 24 2011 Ondrej Vasik - 8.12-4 +- require at least pam >= 1.1.3-7 (#748215) + +* Fri Jul 29 2011 Ondrej Vasik - 8.12-3 +- use acl_extended_file_nofollow() if available (#692823) + * Fri Jul 15 2011 Ondrej Vasik - 8.12-2 - support ecryptfs mount of Private (postlogin into su.pamd) (#722323) @@ -367,7 +419,7 @@ fi - new upstream release coreutils-8.10 * Sat Jan 08 2011 Dennis Gilmore - 8.9-2 -- drop no longer needed mkstemp patch for sparc +- drop no longer needed mkstemp patch for sparc * Tue Jan 04 2011 Ondrej Vasik - 8.9-1 - new upstream release coreutils-8.9