From: Jim Meyering Date: Sun, 14 Jul 2002 11:46:41 +0000 (+0000) Subject: Under some circumstances, rm would fail due to a lack of X-Git-Tag: FILEUTILS-4_1_10~65 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ab4c1d5532c685a1add2fd8fb8ac1f67c7f59b43;p=thirdparty%2Fcoreutils.git Under some circumstances, rm would fail due to a lack of permissions, but give a misleading diagnostic like this: rm: cannot chdir from `.' to `foo': Not a directory (remove_dir): Detect the case in which unlinking a non-directory fails with EPERM, and give an appropriate diagnostic. --- diff --git a/src/remove.c b/src/remove.c index 394e4c4840..8fa482e050 100644 --- a/src/remove.c +++ b/src/remove.c @@ -888,6 +888,10 @@ remove_dir (char const *dir, struct saved_cwd **cwd_state, enum RM_status status; struct stat dir_sb; + /* Save any errno (from caller's failed remove_entry call), in case DIR + is not a directory, so that we can give a reasonable diagnostic. */ + int saved_errno = errno; + if (*cwd_state == NULL) { *cwd_state = XMALLOC (struct saved_cwd, 1); @@ -911,9 +915,21 @@ remove_dir (char const *dir, struct saved_cwd **cwd_state, if (chdir (dir)) { - error (0, errno, - _("cannot chdir from %s to %s"), - quote_n (0, full_filename (".")), quote_n (1, dir)); + if (! S_ISDIR (dir_sb.st_mode)) + { + /* This happens on Linux-2.4.18 when a non-privileged user tries + to delete a file that is owned by another user in a directory + like /tmp that has the S_ISVTX flag set. */ + assert (saved_errno == EPERM); + error (0, saved_errno, + _("cannot remove %s"), quote (full_filename (dir))); + } + else + { + error (0, errno, + _("cannot chdir from %s to %s"), + quote_n (0, full_filename (".")), quote_n (1, dir)); + } return RM_ERROR; }