From 5911eff83efedce91b856b54ae11d94692c7d71e Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 27 Mar 2012 10:02:59 -0700 Subject: chmod: fix symlink race condition * NEWS: Document this. * src/chmod.c (process_file): Don't follow symlink if we think the file is not a symlink. --- src/chmod.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/chmod.c b/src/chmod.c index aa4ac771c..2e1f1c70b 100644 --- a/src/chmod.c +++ b/src/chmod.c @@ -268,7 +268,15 @@ process_file (FTS *fts, FTSENT *ent) if (! S_ISLNK (old_mode)) { - if (chmodat (fts->fts_cwd_fd, file, new_mode) == 0) + /* Use any native support for AT_SYMLINK_NOFOLLOW, to avoid + following a symlink if there is a race. */ + #if HAVE_FCHMODAT || HAVE_LCHMOD + int follow_flag = AT_SYMLINK_NOFOLLOW; + #else + int follow_flag = 0; + #endif + + if (fchmodat (fts->fts_cwd_fd, file, new_mode, follow_flag) == 0) chmod_succeeded = true; else { -- cgit v1.2.3-54-g00ecf