Ondřej Vašík wrote:
> Ondřej Vašík wrote: 
> It reminds me another issue - due to reduce_diagnostic, if you use cp -a
> --preserve=xattr,context , failure diagnostic is reduced, but the
> command itself fails. Additionally for cp and --require-preserve=context
> and ENODATA/ENOTSUP errors on destination filesystem cp just passes
> without error - with no context preserved. All those things are
> addressed by the second patch.

The second patch was incorrect, sorry, it's Friday afternoon...
corrected version attached...

Greetings,
         Ondřej
From 0191d1b04d89e29d346a941246ffc27c4248438e Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Ond=C5=99ej=20Va=C5=A1=C3=ADk?= <[email protected]>
Date: Fri, 24 Apr 2009 14:29:45 +0200
Subject: [PATCH] cp: diagnose failure when preserving xattr/context required even with -a option

* src/copy.c (copy_attr_by_fs): Always show diagnostics when preserving xattrs
is required
             (copy_attr_by_name): Likewise
             (copy_reg): Always show diagnostics when preserving SELinux
context is required
             (copy_internal): Likewise + Do not ignore ENOTSUP and ENODATA
errors when preserving SELinux context is required
* NEWS (Bug fixes): mention it
---
 NEWS       |    5 +++++
 src/copy.c |   16 +++++++++-------
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/NEWS b/NEWS
index 063d07f..b3fb475 100644
--- a/NEWS
+++ b/NEWS
@@ -19,6 +19,11 @@ GNU coreutils NEWS                                    -*- outline -*-
   The bug strikes only with both --recursive (-r, -R) and --link (-l).
   [bug introduced in coreutils-7.1]
 
+  cp now correctly diagnoses selinux/xattr failures when option
+  --preserve=context,xattr is specified with combination with option -a.
+  Additionally do not ignore unsupported operation error when preserving
+  SELinux context was explicitly requested.
+
   ls --sort=version (-v) sorted names beginning with "." inconsistently.
   Now, names that start with "." are always listed before those that don't.
 
diff --git a/src/copy.c b/src/copy.c
index d9db23c..6450826 100644
--- a/src/copy.c
+++ b/src/copy.c
@@ -184,7 +184,8 @@ copy_attr_by_fd (char const *src_path, int src_fd,
     .quote_free = copy_attr_free
   };
   return 0 == attr_copy_fd (src_path, src_fd, dst_path, dst_fd, 0,
-                            x->reduce_diagnostics ? NULL : &ctx);
+                            (x->reduce_diagnostics
+                             && !x->require_preserve_xattr)? NULL : &ctx);
 }
 
 static bool
@@ -198,7 +199,8 @@ copy_attr_by_name (char const *src_path, char const *dst_path,
     .quote_free = copy_attr_free
   };
   return 0 == attr_copy_file (src_path, dst_path, 0,
-                              x-> reduce_diagnostics ? NULL :&ctx);
+                              (x-> reduce_diagnostics
+                               && !x->require_preserve_xattr)? NULL :&ctx);
 }
 #else /* USE_XATTR */
 
@@ -481,7 +483,7 @@ copy_reg (char const *src_name, char const *dst_name,
 	  security_context_t con = NULL;
 	  if (getfscreatecon (&con) < 0)
 	    {
-	      if (!x->reduce_diagnostics)
+	      if (!x->reduce_diagnostics || x->require_preserve_context)
 	        error (0, errno, _("failed to get file system create context"));
 	      if (x->require_preserve_context)
 		{
@@ -494,7 +496,7 @@ copy_reg (char const *src_name, char const *dst_name,
 	    {
 	      if (fsetfilecon (dest_desc, con) < 0)
 		{
-		  if (!x->reduce_diagnostics)
+		  if (!x->reduce_diagnostics || x->require_preserve_context)
 		    error (0, errno,
 			   _("failed to set the security context of %s to %s"),
 			   quote_n (0, dst_name), quote_n (1, con));
@@ -1747,7 +1749,7 @@ copy_internal (char const *src_name, char const *dst_name,
 	{
 	  if (setfscreatecon (con) < 0)
 	    {
-	      if (!x->reduce_diagnostics)
+	      if (!x->reduce_diagnostics || x->require_preserve_context)
 	        error (0, errno,
 		       _("failed to set default file creation context to %s"),
 		       quote (con));
@@ -1761,9 +1763,9 @@ copy_internal (char const *src_name, char const *dst_name,
 	}
       else
 	{
-	  if (errno != ENOTSUP && errno != ENODATA)
+	  if ((errno != ENOTSUP && errno != ENODATA) || x->require_preserve_context)
 	    {
-	      if (!x->reduce_diagnostics)
+	      if (!x->reduce_diagnostics || x->require_preserve_context)
 	        error (0, errno,
 		       _("failed to get security context of %s"),
 		       quote (src_name));
-- 
1.5.6.1.156.ge903b

Attachment: signature.asc
Description: Toto je digitálně podepsaná část zprávy

_______________________________________________
Bug-coreutils mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/bug-coreutils

Reply via email to