GNU bug report logs -
#9170
[PATCH] cp "restores" permissions it never set
Previous Next
Reported by: Eric Lammerts <eric <at> lammerts.org>
Date: Mon, 25 Jul 2011 19:49:01 UTC
Severity: normal
Tags: patch
Done: Paul Eggert <eggert <at> cs.ucla.edu>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
[Message part 1 (text/plain, inline)]
Your bug report
#9170: [PATCH] cp "restores" permissions it never set
which was filed against the coreutils package, has been closed.
The explanation is attached below, along with your original report.
If you require more details, please reply to 9170 <at> debbugs.gnu.org.
--
9170: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=9170
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
Thanks for the bug report. I committed this patch:
From 3960352798e1815e1682a724f6bd9b02677937d1 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert <at> cs.ucla.edu>
Date: Mon, 25 Jul 2011 13:36:16 -0700
Subject: [PATCH] cp: don't mishandle existing dir dest permissions (Bug#9170)
* src/copy.c (copy_internal): If we don't create the directory,
then we cannot have omitted permissions. Problem and trivial
fix reported by Eric Lammerts.
* tests/Makefile.am (TESTS): Add cp/existing-perm-dir.
* tests/cp/existing-perm-dir: New file.
---
src/copy.c | 2 ++
tests/Makefile.am | 1 +
tests/cp/existing-perm-dir | 31 +++++++++++++++++++++++++++++++
3 files changed, 34 insertions(+), 0 deletions(-)
create mode 100755 tests/cp/existing-perm-dir
diff --git a/src/copy.c b/src/copy.c
index df8b1db..b2aeb6e 100644
--- a/src/copy.c
+++ b/src/copy.c
@@ -2211,6 +2211,8 @@ copy_internal (char const *src_name, char const *dst_name,
if (x->verbose)
emit_verbose (src_name, dst_name, NULL);
}
+ else
+ omitted_permissions = 0;
/* Decide whether to copy the contents of the directory. */
if (x->one_file_system && device != 0 && device != src_sb.st_dev)
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 0a83dae..eb67512 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -323,6 +323,7 @@ TESTS = \
cp/dir-rm-dest \
cp/dir-slash \
cp/dir-vs-file \
+ cp/existing-perm-dir \
cp/existing-perm-race \
cp/fail-perm \
cp/fiemap-empty \
diff --git a/tests/cp/existing-perm-dir b/tests/cp/existing-perm-dir
new file mode 100755
index 0000000..6ef73f0
--- /dev/null
+++ b/tests/cp/existing-perm-dir
@@ -0,0 +1,31 @@
+#!/bin/sh
+# Make sure cp -p doesn't "restore" permissions it shouldn't (Bug#9170).
+
+# Copyright 2011 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
+
+umask 002
+mkdir -p -m ug-s,u=rwx,g=rwx,o=rx src/dir || fail=1
+mkdir -p -m ug-s,u=rwx,g=,o= dst/dir || fail=1
+
+cp -r src/. dst/ || fail=1
+
+mode=`ls -ld dst/dir | cut -b-10`
+test "$mode" = drwx------ || fail=1
+
+Exit $fail
--
1.7.4.4
[Message part 3 (message/rfc822, inline)]
Hi,
I'm seeing the following strange behavior:
$ umask
0002
$ rm -rf /tmp/src /tmp/dst
$ mkdir -m775 /tmp/src /tmp/src/foo
$ mkdir -m700 /tmp/dst /tmp/dst/foo
$ ls -ld /tmp/dst/foo
drwx------ 2 eric eric 4096 Jul 25 13:40 /tmp/dst/foo
$ cp -r /tmp/src/. /tmp/dst/
$ ls -ld /tmp/dst/foo
drwx-w---- 2 eric eric 4096 Jul 25 13:40 /tmp/dst/foo
Patch below fixes this.
cheers,
Eric
diff --git a/src/copy.c b/src/copy.c
index 65566a0..b9c0ccf 100644
--- a/src/copy.c
+++ b/src/copy.c
@@ -2197,6 +2197,8 @@ copy_internal (char const *src_name, char const *dst_name,
if (x->verbose)
emit_verbose (src_name, dst_name, NULL);
}
+ else
+ omitted_permissions = 0;
/* Decide whether to copy the contents of the directory. */
if (x->one_file_system && device != 0 && device != src_sb.st_dev)
This bug report was last modified 13 years and 305 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.