bug-coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

more chown/chgrp fixes


From: Jim Meyering
Subject: more chown/chgrp fixes
Date: Fri, 13 Oct 2006 23:11:47 +0200

I haven't tried hard enough (yet?) to come up with test cases
that demonstrate problems.  If anyone can come up with one or
two, I'd be grateful.

2006-10-13  Jim Meyering  <address@hidden>

        More chown/chgrp dereferencing-related fixes.
        * src/chown-core.c (change_file_owner): Don't use fts_statp if
        we're dereferencing symlinks.
        Reverse conjuncts, so that we use dereference file_stats
        (aka ent->fts_statp) only *after* we've confirmed that
        chopt->affect_symlink_referent is true.  Otherwise, we might
        use ent->fts_statp uninitialized.
        Don't turn on FTS_NOSTAT when dereferencing symlinks.
        * tests/chown/deref: Update the expected diagnostic, now that
        this test case (trying to use "chown --dereference ..." on a
        dangling symlink) takes a different code path.

Index: src/chown-core.c
===================================================================
RCS file: /fetish/cu/src/chown-core.c,v
retrieving revision 1.44
diff -u -r1.44 chown-core.c
--- src/chown-core.c    13 Oct 2006 18:51:08 -0000      1.44
+++ src/chown-core.c    13 Oct 2006 19:54:06 -0000
@@ -305,7 +305,9 @@
       file_stats = NULL;
     }
   else if (required_uid == (uid_t) -1 && required_gid == (gid_t) -1
-          && chopt->verbosity == V_off && ! chopt->root_dev_ino)
+          && chopt->verbosity == V_off
+          && ! chopt->root_dev_ino
+          && ! chopt->affect_symlink_referent)
     {
       do_chown = true;
       file_stats = ent->fts_statp;
@@ -316,7 +318,7 @@

       /* If this is a symlink and we're dereferencing them,
         stat it to get info on the referent.  */
-      if (S_ISLNK (file_stats->st_mode) && chopt->affect_symlink_referent)
+      if (chopt->affect_symlink_referent && S_ISLNK (file_stats->st_mode))
        {
          if (fstatat (fts->fts_cwd_fd, file, &stat_buf, 0) != 0)
            {
@@ -454,6 +456,7 @@

   /* Use lstat and stat only if they're needed.  */
   int stat_flags = ((required_uid != (uid_t) -1 || required_gid != (gid_t) -1
+                    || chopt->affect_symlink_referent
                     || chopt->verbosity != V_off || chopt->root_dev_ino)
                    ? 0
                    : FTS_NOSTAT);
Index: tests/chown/deref
===================================================================
RCS file: /fetish/cu/tests/chown/deref,v
retrieving revision 1.5
diff -u -r1.5 deref
--- tests/chown/deref   17 Aug 2006 19:58:25 -0000      1.5
+++ tests/chown/deref   13 Oct 2006 20:56:02 -0000
@@ -2,7 +2,7 @@
 # For coreutils-5.2.1 and earlier, chown --dereference would skip
 # symlinks having owner/group matching the specified owner/group.

-# Copyright (C) 2004 Free Software Foundation, Inc.
+# Copyright (C) 2004, 2006 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
@@ -50,7 +50,7 @@
 sed 's/: [^:]*$//' out1 > out

 cat <<\EOF > exp || fail=1
-chown: changing ownership of `dangle'
+chown: cannot dereference `dangle'
 EOF

 cmp out exp || fail=1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]