+2006-10-13 Jim Meyering <jim@meyering.net>
+
+ 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.
+
2006-10-13 Paul Eggert <eggert@cs.ucla.edu>
Sync from Bison, as follows:
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;
/* 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)
{
/* 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);
# 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
sed 's/: [^:]*$//' out1 > out
cat <<\EOF > exp || fail=1
-chown: changing ownership of `dangle'
+chown: cannot dereference `dangle'
EOF
cmp out exp || fail=1