diff --git a/coreutils-mvatomic.patch b/coreutils-mvatomic.patch new file mode 100644 index 0000000..00c7298 --- /dev/null +++ b/coreutils-mvatomic.patch @@ -0,0 +1,103 @@ + src/copy.c | 5 +++-- + tests/mv/Makefile.am | 4 ++-- + tests/mv/atomic2 | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 55 insertions(+), 4 deletions(-) + create mode 100755 tests/mv/atomic2 + +diff --git a/src/copy.c b/src/copy.c +index fd31b5c..208a674 100644 +--- a/src/copy.c ++++ b/src/copy.c +@@ -1339,10 +1339,11 @@ copy_internal (char const *src_name, char const *dst_name, + new_dst = true; + } + else if (! S_ISDIR (dst_sb.st_mode) ++ /* Never unlink dst_name when in move mode. */ ++ && ! x->move_mode + && (x->unlink_dest_before_opening + || (x->preserve_links && 1 < dst_sb.st_nlink) +- || (!x->move_mode +- && x->dereference == DEREF_NEVER ++ || (x->dereference == DEREF_NEVER + && S_ISLNK (src_sb.st_mode)) + )) + { +diff --git a/tests/mv/Makefile.am b/tests/mv/Makefile.am +index c121911..92ec68e 100644 +--- a/tests/mv/Makefile.am ++++ b/tests/mv/Makefile.am +@@ -1,7 +1,6 @@ + # Make coreutils tests for "mv". -*-Makefile-*- + +-# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 +-# Free Software Foundation, Inc. ++# Copyright (C) 1998-2008 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 +@@ -17,6 +16,7 @@ + # along with this program. If not, see . + + TESTS = \ ++ atomic2 \ + sticky-to-xpart \ + hard-verbose \ + backup-dir \ +diff --git a/tests/mv/atomic2 b/tests/mv/atomic2 +new file mode 100755 +index 0000000..d1029aa +--- /dev/null ++++ b/tests/mv/atomic2 +@@ -0,0 +1,50 @@ ++#!/bin/sh ++# ensure that mv doesn't first unlink a multi-hard-linked destination ++ ++# Copyright (C) 2008 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 . ++ ++if test "$VERBOSE" = yes; then ++ set -x ++ mv --version ++fi ++ ++. $srcdir/../test-lib.sh ++require_strace_ ++ ++# Before the fix, mv would unnecessarily unlink the destination symlink: ++# $ rm -f a b b2; touch a b; ln b b2; strace -e unlink /p/bin/mv a b ++# unlink("b") = 0 ++# ++# With the fix, it doesn't call unlink: ++# $ rm -f a b b2; touch a b; ln b b2; strace -e unlink ./mv a b ++# $ ++ ++touch a b || framework_failure ++ln b b2 || framework_failure ++ ++fail=0 ++ ++strace -qe unlink mv a b > out 2>&1 || fail=1 ++$EGREP 'unlink.*"b"' out && fail=1 ++ ++# Ensure that the source, "a", is gone. ++ls -dl a > /dev/null 2>&1 && fail=1 ++ ++# Ensure that the destination, "b", has link count 1. ++n_links=`stat --printf=%h b` || fail=1 ++test "$n_links" = 1 || fail=1 ++ ++(exit $fail); exit $fail +-- +1.5.5.rc0.7.g57e83 diff --git a/coreutils.spec b/coreutils.spec index bcc2f0b..3527f6d 100644 --- a/coreutils.spec +++ b/coreutils.spec @@ -1,7 +1,7 @@ Summary: The GNU core utilities: a set of tools commonly used in shell scripts Name: coreutils Version: 6.10 -Release: 13%{?dist} +Release: 14%{?dist} License: GPLv3+ Group: System Environment/Base Url: http://www.gnu.org/software/coreutils/ @@ -20,6 +20,7 @@ Source203: coreutils-runuser-l.pamd # From upstream Patch1: coreutils-6.10-verbose.patch Patch2: coreutils-dddoubleclose.patch +Patch3: coreutils-mvatomic.patch # Our patches Patch100: coreutils-chgrp.patch @@ -99,6 +100,7 @@ cd %name-%version # From upstream %patch1 -p1 -b .verbose %patch2 -p1 -b .doubleclose +%patch3 -p1 -b .atomic # Our patches %patch100 -p1 -b .chgrp @@ -295,6 +297,10 @@ fi /sbin/runuser %changelog +* Wed Mar 19 2008 Ondrej Vasik - 6.10-14 +- mv: never unlink a destination file before calling rename + (upstream, #438076) + * Mon Mar 17 2008 Ondrej Vasik - 6.10-13 - disable echo option separator behavior(added by #431005, request for removal #437653 + upstream)