Previously, only the basenames were printed, leading to ambiguity when
multiple directories had a file with the same name. E.g., here is the
old output:

    $ mkdir -p a/{b,c}
    $ touch a/{b,c}/d
    $ strace -o /dev/null -e inject=lsetxattr:error=EIO \
        chcon -R -u root a
    chcon: failed to change context of 'd' to '...': ...
    chcon: failed to change context of 'b' to '...': ...
    chcon: failed to change context of 'd' to '...': ...
    chcon: failed to change context of 'c' to '...': ...
    chcon: failed to change context of 'a' to '...': ...

Here is the new output:

    $ strace -o /dev/null -e inject=lsetxattr:error=EIO \
        src/chcon -R -u root a
    chcon: failed to change context of 'a/b/d' to '...': ...
    chcon: failed to change context of 'a/b' to '...': ...
    chcon: failed to change context of 'a/c/d' to '...': ...
    chcon: failed to change context of 'a/c' to '...': ...
    chcon: failed to change context of 'a' to '...': ...

This also aligns the output with other programs, e.g., 'chown':

    $ strace -o /dev/null -e inject=chown,fchown,fchownat:error=EIO \
        chown -R root a
    chown: changing ownership of 'a/b/d': ...
    chown: changing ownership of 'a/b': ...
    chown: changing ownership of 'a/c/d': ...
    chown: changing ownership of 'a/c': ...
    chown: changing ownership of 'a': ...

* src/chcon.c (change_file_context): Add an argument for the full file
name. Use it in error messages.
(process_file): Pass the full file name from the FTSENT.
* NEWS: Mention the bug fix.
---
 NEWS        |  4 ++++
 src/chcon.c | 13 ++++++++-----
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/NEWS b/NEWS
index 6b4d6855e..4e2c1d65d 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,10 @@ GNU coreutils NEWS                                    -*- 
outline -*-
   'basenc --base32hex' no longer decodes BASE32 only characters "WXYZ".
   [bug introduced with the basenc program in coreutils-8.31]
 
+  'chcon' now emits the entire file name in error messages when setting the
+  security context fails instead of the basename.
+  [bug introduced with the chcon program in coreutils-6.9.90]
+
   'chroot --userspec=USER' now uses the primary group of USER as looked up
   inside the chroot.  Previously the group looked up outside the chroot
   was used, even when the look-up inside the chroot succeeded.
diff --git a/src/chcon.c b/src/chcon.c
index 4ab2d7570..4b0e71ed3 100644
--- a/src/chcon.c
+++ b/src/chcon.c
@@ -138,7 +138,8 @@ compute_context_from_mask (char const *context, context_t 
*ret)
    Return 0 if successful, 1 if errors occurred. */
 
 static int
-change_file_context (int fd, char const *file, bool ignore_missing)
+change_file_context (char const *file_full_name, int fd, char const *file,
+                     bool ignore_missing)
 {
   char *file_context = NULL;
   context_t context IF_LINT (= NULL);
@@ -156,7 +157,7 @@ change_file_context (int fd, char const *file, bool 
ignore_missing)
           if (ignore_missing && ignorable_traversal_errno (errno))
             return 0;
           error (0, errno, _("failed to get security context of %s"),
-                 quoteaf (file));
+                 quoteaf (file_full_name));
           return 1;
         }
 
@@ -166,7 +167,7 @@ change_file_context (int fd, char const *file, bool 
ignore_missing)
       if (file_context == NULL)
         {
           error (0, 0, _("can't apply partial context to unlabeled file %s"),
-                 quoteaf (file));
+                 quoteaf (file_full_name));
           return 1;
         }
 
@@ -195,7 +196,8 @@ change_file_context (int fd, char const *file, bool 
ignore_missing)
             {
               errors = 1;
               error (0, errno, _("failed to change context of %s to %s"),
-                     quoteaf_n (0, file), quote_n (1, context_string));
+                     quoteaf_n (0, file_full_name),
+                     quote_n (1, context_string));
             }
         }
     }
@@ -305,7 +307,8 @@ process_file (FTS *fts, FTSENT *ent)
         printf (_("changing security context of %s\n"),
                 quoteaf (file_full_name));
 
-      if (change_file_context (fts->fts_cwd_fd, file, ignore_missing) != 0)
+      if (change_file_context (file_full_name, fts->fts_cwd_fd, file,
+                               ignore_missing) != 0)
         ok = false;
     }
 
-- 
2.56.0


Reply via email to