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 <[EMAIL PROTECTED]> 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 _______________________________________________ Bug-coreutils mailing list Bug-coreutils@gnu.org http://lists.gnu.org/mailman/listinfo/bug-coreutils