GNU bug report logs - #9170
[PATCH] cp "restores" permissions it never set

Previous Next

Package: coreutils;

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

From: help-debbugs <at> gnu.org (GNU bug Tracking System)
To: Eric Lammerts <eric <at> lammerts.org>
Subject: bug#9170: closed (Re: bug#9170: [PATCH] cp "restores" permissions
 it never set)
Date: Mon, 25 Jul 2011 21:07:02 +0000
[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)]
From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Eric Lammerts <eric <at> lammerts.org>
Cc: 9170-done <at> debbugs.gnu.org
Subject: Re: bug#9170: [PATCH] cp "restores" permissions it never set
Date: Mon, 25 Jul 2011 14:06:26 -0700
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)]
From: Eric Lammerts <eric <at> lammerts.org>
To: bug-coreutils <at> gnu.org
Subject: [PATCH] cp "restores" permissions it never set
Date: Mon, 25 Jul 2011 14:50:50 -0400 (EDT)
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.