Fix a bug: cp -x would fail to set mount point permissions.
authorAndrew Church <achurch@achurch.org>
Sat, 3 Mar 2007 22:00:18 +0000 (23:00 +0100)
committerJim Meyering <jim@meyering.net>
Sat, 3 Mar 2007 22:00:18 +0000 (23:00 +0100)
* NEWS: mention cp -x bug fix
* src/copy.c (copy_internal): Don't return immediately after
copying a mount point that we do not intend to recurse under.
Based on a patch by Andrew Church.

ChangeLog
NEWS
src/copy.c

index 4a92b16..9bec73d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2007-03-03  Andrew Church  <achurch@achurch.org>  (tiny change)
+           Paul Eggert  <eggert@cs.ucla.edu>
+
+       Fix a bug: cp -x would fail to set mount point permissions.
+       * NEWS: mention cp -x bug fix
+       * src/copy.c (copy_internal): Don't return immediately after
+       copying a mount point that we do not intend to recurse under.
+       Based on a patch by Andrew Church.
+
 2007-03-03  Jim Meyering  <jim@meyering.net>
 
        pwd-unreadable-parent: Skip test on ia64/Linux, too.
diff --git a/NEWS b/NEWS
index 65a7d52..57c51e1 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,8 @@ GNU coreutils NEWS                                    -*- outline -*-
 
 ** Bug fixes
 
+  cp -x (--one-file-system) would fail to set mount point permissions
+
   The default block size and output format for df -P are now unaffected by
   the DF_BLOCK_SIZE, BLOCK_SIZE, and BLOCKSIZE environment variables.  It
   is still affected by POSIXLY_CORRECT, though.
index 000c248..49bbb8c 100644 (file)
@@ -1604,19 +1604,20 @@ copy_internal (char const *src_name, char const *dst_name,
            emit_verbose (src_name, dst_name, NULL);
        }
 
-      /* Are we crossing a file system boundary?  */
+      /* Decide whether to copy the contents of the directory.  */
       if (x->one_file_system && device != 0 && device != src_sb.st_dev)
-       return true;
-
-      /* Copy the contents of the directory.  */
-
-      if (! copy_dir (src_name, dst_name, new_dst, &src_sb, dir, x,
-                     copy_into_self))
        {
-         /* Don't just return here -- otherwise, the failure to read a
-            single file in a source directory would cause the containing
-            destination directory not to have owner/perms set properly.  */
-         delayed_ok = false;
+         /* Here, we are crossing a file system boundary and cp's -x option
+            is in effect: so don't copy the contents of this directory. */
+       }
+      else
+       {
+         /* Copy the contents of the directory.  Don't just return if
+            this fails -- otherwise, the failure to read a single file
+            in a source directory would cause the containing destination
+            directory not to have owner/perms set properly.  */
+         delayed_ok = copy_dir (src_name, dst_name, new_dst, &src_sb, dir, x,
+                                copy_into_self);
        }
     }
   else if (x->symbolic_link)