Hello community, here is the log from the commit of package coreutils for openSUSE:Factory checked in at 2012-05-07 22:44:32 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/coreutils (Old) and /work/SRC/openSUSE:Factory/.coreutils.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "coreutils", Maintainer is "p...@suse.com" Changes: -------- --- /work/SRC/openSUSE:Factory/coreutils/coreutils.changes 2012-05-03 10:54:49.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.coreutils.new/coreutils.changes 2012-05-07 22:46:47.000000000 +0200 @@ -1,0 +2,22 @@ +Mon May 7 14:22:29 CEST 2012 - p...@suse.de + +- Two new upstream patches: + + * id and groups, when invoked with no user name argument, would + print the default group ID listed in the password database, and + sometimes that ID would be neither real nor effective. For + example, when run set-GID, or in a session for which the default + group has just been changed, the new group ID would be listed, + even though it is not yet effective. + + * 'cp S D' is no longer subject to a race: if an existing D were + removed between the initial stat and subsequent + open-without-O_CREAT, cp would fail with a confusing diagnostic + saying that the destination, D, was not found. Now, in this + unusual case, it retries the open (but with O_CREAT), and hence + usually succeeds. With NFS attribute caching, the condition was + particularly easy to trigger, since there, the removal of D could + precede the initial stat. [This bug was present in "the + beginning".] (bnc#760926). + +------------------------------------------------------------------- New: ---- coreutils-id_show_real_groups.patch coreutils-race_in_cp.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ coreutils.spec ++++++ --- /var/tmp/diff_new_pack.9yuJ7g/_old 2012-05-07 22:46:49.000000000 +0200 +++ /var/tmp/diff_new_pack.9yuJ7g/_new 2012-05-07 22:46:49.000000000 +0200 @@ -75,6 +75,10 @@ Patch34: coreutils-acl-nofollow.patch Patch36: coreutils-basename_documentation.patch Patch37: coreutils-bnc#697897-setsid.patch +#Upstream patch will be included with 8.17 +Patch38: coreutils-id_show_real_groups.patch +#Upstream patch, needs to be removed for 8.17 +Patch39: coreutils-race_in_cp.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build # this will create a cycle, broken up randomly - coreutils is just too core to have other # prerequires @@ -118,6 +122,8 @@ %patch34 %patch36 %patch37 +%patch38 +%patch39 xz -dc %{S:4} >po/de.po ++++++ coreutils-id_show_real_groups.patch ++++++ commit 032a549481444395558286b433296c97c09c721d Author: Jim Meyering <meyer...@redhat.com> Date: Fri Apr 27 13:28:32 2012 +0200 id,groups: with no user name, print only real and/or effective IDs, ... i.e., don't use the getpw* functions. Before this change, running groups or id with no user name argument would include a group name or ID from /etc/passwd. Thus, under unusual circumstances (default group is changed, but has not taken effect for a given session), those programs could print a name or ID that is neither real nor effective. To demonstrate, run this: echo 'for i in 1 2; do id -G; sleep 1.5; done' \ |su -s /bin/sh ftp - & sleep 1; perl -pi -e 's/^(ftp:x:\d+):(\d+)/$1:9876/' /etc/passwd Those id -G commands printed the following: 50 50 9876 With this change, they print this: 50 50 Similarly, running those programs set-GID could make them print one ID too many. * src/group-list.c (print_group_list): When username is NULL, pass egid, not getpwuid(ruid)->pw_gid), to xgetgroups, per the API requirements of xgetgroups callee, mgetgroups. When not using the password database, don't call getpwuid. * NEWS (Bug fixes): Mention it. * tests/misc/id-setgid: New file. * tests/Makefile.am (TESTS): Add it. (root_tests): It's a root-only test, so add it here, too. Originally reported by Brynnen Owen as http://bugs.gnu.org/7320. Raised again by Marc Mengel in http://bugzilla.redhat.com/816708. Index: NEWS =================================================================== --- NEWS.orig 2012-03-26 14:06:43.000000000 +0200 +++ NEWS 2012-05-07 14:20:23.431517270 +0200 @@ -1,5 +1,15 @@ GNU coreutils NEWS -*- outline -*- +** Bug fixes + + id and groups, when invoked with no user name argument, would print + the default group ID listed in the password database, and sometimes + that ID would be neither real nor effective. For example, when run + set-GID, or in a session for which the default group has just been + changed, the new group ID would be listed, even though it is not + yet effective. + + * Noteworthy changes in release 8.16 (2012-03-26) [stable] ** New features Index: THANKS.in =================================================================== --- THANKS.in.orig 2012-03-24 19:22:13.000000000 +0100 +++ THANKS.in 2012-05-07 14:19:38.953620833 +0200 @@ -98,6 +98,7 @@ Brian Silverman bsil Brian Youmans 3d...@gnu.org Britton Leo Kerin fs...@aurora.uaf.edu Bruce Robertson bru...@theodolite.dyndns.org +Brynnen Owen o...@illinois.edu Carl Johnson ca...@cjlinux.home.org Carl Lowenstein c...@mpl.ucsd.edu Carl Roth r...@urs.us @@ -355,6 +356,7 @@ Manfred Hollstein manf Марк Коренберг socketp...@gmail.com Marc Boucher m...@mbsi.ca Marc Haber mh+debian-b...@zugschlus.de +Marc Mengel men...@fnal.gov Marc Lehman schm...@schmorp.de Marc Olzheim marc...@stack.nl Marco Franzen marco.fran...@thyron.com Index: src/group-list.c =================================================================== --- src/group-list.c.orig 2012-02-03 14:16:13.000000000 +0100 +++ src/group-list.c 2012-05-07 14:19:38.953620833 +0200 @@ -38,11 +38,14 @@ print_group_list (const char *username, bool use_names) { bool ok = true; - struct passwd *pwd; + struct passwd *pwd = NULL; - pwd = getpwuid (ruid); - if (pwd == NULL) - ok = false; + if (username) + { + pwd = getpwuid (ruid); + if (pwd == NULL) + ok = false; + } if (!print_group (rgid, use_names)) ok = false; @@ -58,8 +61,7 @@ print_group_list (const char *username, gid_t *groups; int i; - int n_groups = xgetgroups (username, (pwd ? pwd->pw_gid : (gid_t) -1), - &groups); + int n_groups = xgetgroups (username, (pwd ? pwd->pw_gid : egid), &groups); if (n_groups < 0) { if (username) Index: tests/Makefile.am =================================================================== --- tests/Makefile.am.orig 2012-05-07 14:19:38.807624454 +0200 +++ tests/Makefile.am 2012-05-07 14:19:38.953620833 +0200 @@ -36,6 +36,7 @@ root_tests = \ ls/nameless-uid \ misc/chcon \ misc/chroot-credentials \ + misc/id-setgid \ misc/selinux \ misc/truncate-owned-by-other \ mkdir/writable-under-readonly \ @@ -197,6 +198,7 @@ TESTS = \ misc/head-pos \ misc/id-context \ misc/id-groups \ + misc/id-setgid \ misc/md5sum \ misc/md5sum-bsd \ misc/md5sum-newline \ Index: tests/misc/id-setgid =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ tests/misc/id-setgid 2012-05-07 14:19:38.953620833 +0200 @@ -0,0 +1,34 @@ +#!/bin/sh +# Verify that id -G prints the right group when run set-GID. + +# 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 <http://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +print_ver_ id +require_root_ + +g=$(id -u $NON_ROOT_USERNAME) || framework_failure_ + +# Construct a different group number. +gp1=$(expr $g + 1) + +echo $gp1 > exp || framework_failure_ + +setuidgid -g $gp1 $NON_ROOT_USERNAME env PATH="$PATH" id -G > out || fail=1 +compare exp out || fail=1 +# With coreutils-8.16 and earlier, id -G would print both: $gp1 $g + +Exit $fail ++++++ coreutils-race_in_cp.patch ++++++ commit ee9e43460f366406edff96b5abfb3ff33587e062 Author: Jim Meyering <meyer...@redhat.com> Date: Fri May 4 16:42:31 2012 +0200 cp: handle a race condition more sensibly * src/copy.c (copy_reg): In a narrow race (stat sees dest, yet open-without-O_CREAT fails with ENOENT), retry the open with O_CREAT. * tests/cp/nfs-removal-race: New file. * tests/Makefile.am (TESTS): Add it. * NEWS (Bug fixes): Mention it. Reported by Philipp Thomas and Neil F. Brown in http://bugs.gnu.org/11100 Index: NEWS =================================================================== --- NEWS.orig 2012-05-07 14:20:52.079810454 +0200 +++ NEWS 2012-05-07 14:21:35.566738140 +0200 @@ -9,6 +9,14 @@ GNU coreutils NEWS changed, the new group ID would be listed, even though it is not yet effective. + 'cp S D' is no longer subject to a race: if an existing D were removed + between the initial stat and subsequent open-without-O_CREAT, cp would + fail with a confusing diagnostic saying that the destination, D, was not + found. Now, in this unusual case, it retries the open (but with O_CREAT), + and hence usually succeeds. With NFS attribute caching, the condition + was particularly easy to trigger, since there, the removal of D could + precede the initial stat. [This bug was present in "the beginning".] + * Noteworthy changes in release 8.16 (2012-03-26) [stable] Index: THANKS.in =================================================================== --- THANKS.in.orig 2012-05-07 14:20:52.079810454 +0200 +++ THANKS.in 2012-05-07 14:20:52.087810257 +0200 @@ -439,7 +439,7 @@ Minh Tran-Le tran Morten Welinder te...@diku.dk Nao Nishijima nao.nishijima...@hitachi.com Neal H Walfield n...@cs.uml.edu -Neil Brown ne...@cse.unsw.edu.au +Neil F. Brown ne...@suse.de Nelson H. F. Beebe be...@math.utah.edu Nick Estes deb...@nickstoys.com Nick Graham nick.d.gra...@gmail.com @@ -489,6 +489,7 @@ Phil Richards phil Philippe De Muyter p...@macqel.be Philippe Schnoebelen philippe.schnoebe...@imag.fr Phillip Jones mo...@datastacks.com +Philipp Thomas p...@suse.de Piergiorgio Sartor sar...@sony.de Pieter Bowman bow...@math.utah.edu Piotr Gackiewicz ga...@intertele.pl Index: src/copy.c =================================================================== --- src/copy.c.orig 2012-03-24 21:26:51.000000000 +0100 +++ src/copy.c 2012-05-07 14:20:52.087810257 +0200 @@ -889,6 +889,8 @@ copy_reg (char const *src_name, char con if (*new_dst) { + open_with_O_CREAT:; + int open_flags = O_WRONLY | O_CREAT | O_BINARY; dest_desc = open (dst_name, open_flags | O_EXCL, dst_mode & ~omitted_permissions); @@ -939,6 +941,23 @@ copy_reg (char const *src_name, char con if (dest_desc < 0) { + /* If we've just failed due to ENOENT for an ostensibly preexisting + destination (*new_dst was 0), that's a bit of a contradiction/race: + the prior stat/lstat said the file existed (*new_dst was 0), yet + the subsequent open-existing-file failed with ENOENT. With NFS, + the race window is wider still, since its meta-data caching tends + to make the stat succeed for a just-removed remote file, while the + more-definitive initial open call will fail with ENOENT. When this + situation arises, we attempt to open again, but this time with + O_CREAT. Do this only when not in move-mode, since when handling + a cross-device move, we must never open an existing destination. */ + if (dest_errno == ENOENT && ! *new_dst && ! x->move_mode) + { + *new_dst = 1; + goto open_with_O_CREAT; + } + + /* Otherwise, it's an error. */ error (0, dest_errno, _("cannot create regular file %s"), quote (dst_name)); return_val = false; Index: tests/Makefile.am =================================================================== --- tests/Makefile.am.orig 2012-05-07 14:20:52.080810429 +0200 +++ tests/Makefile.am 2012-05-07 14:20:52.087810257 +0200 @@ -347,6 +347,7 @@ TESTS = \ cp/link-no-deref \ cp/link-preserve \ cp/link-symlink \ + cp/nfs-removal-race \ cp/no-deref-link1 \ cp/no-deref-link2 \ cp/no-deref-link3 \ Index: tests/cp/nfs-removal-race =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ tests/cp/nfs-removal-race 2012-05-07 14:20:52.087810257 +0200 @@ -0,0 +1,70 @@ +#!/bin/sh +# Running cp S D on an NFS client while another client has just removed D +# would lead (w/coreutils-8.16 and earlier) to cp's initial stat call +# seeing (via stale NFS cache) that D exists, so that cp would then call +# open without the O_CREAT flag. Yet, the open must actually consult +# the server, which confesses that D has been deleted, thus causing the +# open call to fail with ENOENT. +# +# This test simulates that situation by intercepting stat for a nonexistent +# destination, D, and making the stat fill in the result struct for another +# file and return 0. +# +# This test is skipped on systems that lack LD_PRELOAD support; that's fine. +# Similarly, on a system that lacks <dlfcn.h> or __xstat, skipping it is 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 <http://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +print_ver_ cp + +# Replace each stat call with a call to this wrapper. +cat > k.c <<'EOF' || framework_failure_ +#define _GNU_SOURCE +#include <sys/types.h> +#include <dlfcn.h> + +#define __xstat __xstat_orig + +#include <sys/stat.h> +#include <stddef.h> + +#undef __xstat + +int +__xstat (int ver, const char *path, struct stat *st) +{ + static int (*real_stat)(int ver, const char *path, struct stat *st) = NULL; + if (!real_stat) + real_stat = dlsym (RTLD_NEXT, "__xstat"); + /* When asked to stat nonexistent "d", + return results suggesting it exists. */ + return real_stat (ver, *path == 'd' && path[1] == 0 ? "d2" : path, st); +} +EOF + +# Then compile/link it: +$CC -shared -fPIC -O2 k.c -o k.so \ + || framework_failure_ 'failed to compile with -shared -fPIC' + +touch d2 || framework_failure_ +echo xyz > src || framework_failure_ + +# Finally, run the test: +LD_PRELOAD=./k.so cp src d || fail=1 + +compare src d || fail=1 +Exit $fail -- To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org For additional commands, e-mail: opensuse-commit+h...@opensuse.org