]> git.ipfire.org Git - thirdparty/coreutils.git/commit
Make a failing cross-partition mv give a sensible diagnostic.
authorJim Meyering <meyering@redhat.com>
Fri, 5 Oct 2007 08:55:26 +0000 (10:55 +0200)
committerJim Meyering <meyering@redhat.com>
Fri, 5 Oct 2007 11:26:46 +0000 (13:26 +0200)
commitb4148f567d9bf7abc8e82a6f2e252f28da93f354
treec02cabad7e804828d02acc5875bf9ae10f303a27
parent068fa34adcb846244c81704de2872102310de86e
Make a failing cross-partition mv give a sensible diagnostic.

A cross-partition move of a file in a sticky tmpdir and owned by
another user would evoke an invalid diagnostic after copying it:

  mv: cannot remove `x': Operation not permitted

Either of the following (mv.c, remove.c) changes would fix the bug by
itself.  I think it's slightly better to use both; the added cost is
minimal: mv: an extra lstat-per-mv-cmdline-arg-that-goes-cross-partition,
rm: an extra lstat-per-unlink-that-fails-w/EPERM.
* src/remove.c (remove_entry): Also lstat the file upon EPERM.
* src/mv.c (rm_option_init): Initialize root_dev_ino just as is done
in rm, so that a cross-partition invoked remove.c:rm call works the
same way as one invoked from the command-line use of "rm".  That
setting of root_dev_ino makes rm() do the equivalent of an additional
lstat for each argument, which in turn gives rm enough information to
issue the right diagnostic.
* tests/mv/sticky-to-xpart (version): New file.  Test for the above.
* tests/mv/Makefile.am (TESTS): Add sticky-to-xpart.
Arrange for "make check-root" to run the new root-only test.
* tests/Makefile.am (tb): New target, to run the new root-only test.
(all_t): Add tb.
* src/c99-to-c89.diff: Adjust offsets.
ChangeLog
src/c99-to-c89.diff
src/mv.c
src/remove.c
tests/Makefile.am
tests/mv/Makefile.am
tests/mv/sticky-to-xpart [new file with mode: 0755]