summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2007-09-22 08:40:47 +0200
committerJim Meyering <jim@meyering.net>2007-09-22 08:44:42 +0200
commit920b4416c147ecb76731137158da8bcc9041fecd (patch)
treeb5dee14b3d092f9abbc82aeddd19a4c4488437fd
parentebeb56f9dfd14d50b4ec237730e7bef9336f7cc7 (diff)
downloadcoreutils-920b4416c147ecb76731137158da8bcc9041fecd.tar.xz
rm: fix a tiny, nearly inconsequential bug.
Don't perform a "."-relative lstat, when the file in question may well not be in ".". Although this is a bug, a few attempts to exercise it on a linux-2.6.22 system failed. You probably need a pre-openat system to trigger the failure. The consequence of this bug would be a lower-quality diagnostic upon failed dir removal. * src/remove.c (is_dir_lstat): Add a parameter, fd_cwd. Use it instead of hard-coding AT_FDCWD. (remove_entry): Call is_dir_lstat with fd_cwd. Signed-off-by: Jim Meyering <jim@meyering.net>
-rw-r--r--ChangeLog12
-rw-r--r--src/remove.c7
2 files changed, 16 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 989fb239c..730ba2297 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2007-09-22 Jim Meyering <jim@meyering.net>
+
+ rm: fix a tiny, nearly inconsequential bug.
+ Don't perform a "."-relative lstat, when the file in question
+ may well not be in ".". Although this is a bug, a few attempts
+ to exercise it on a linux-2.6.22 system failed. You probably need
+ a pre-openat system to trigger the failure. The consequence of this
+ bug would be a lower-quality diagnostic upon failed dir removal.
+ * src/remove.c (is_dir_lstat): Add a parameter, fd_cwd.
+ Use it instead of hard-coding AT_FDCWD.
+ (remove_entry): Call is_dir_lstat with fd_cwd.
+
2007-09-22 Karl Berry <karl@freefriends.org>
* TODO: It'd be nice to add renice.
diff --git a/src/remove.c b/src/remove.c
index 773ed12dc..aae7a8888 100644
--- a/src/remove.c
+++ b/src/remove.c
@@ -927,11 +927,11 @@ prompt (int fd_cwd, Dirstack_state const *ds, char const *filename,
*ST is FILENAME's tstatus.
Do not modify errno. */
static inline bool
-is_dir_lstat (char const *filename, struct stat *st)
+is_dir_lstat (int fd_cwd, char const *filename, struct stat *st)
{
int saved_errno = errno;
bool is_dir =
- (cache_fstatat (AT_FDCWD, filename, st, AT_SYMLINK_NOFOLLOW) == 0
+ (cache_fstatat (fd_cwd, filename, st, AT_SYMLINK_NOFOLLOW) == 0
&& S_ISDIR (st->st_mode));
errno = saved_errno;
return is_dir;
@@ -1061,7 +1061,8 @@ remove_entry (int fd_cwd, Dirstack_state const *ds, char const *filename,
/* Upon a failed attempt to unlink a directory, most non-Linux systems
set errno to the POSIX-required value EPERM. In that case, change
errno to EISDIR so that we emit a better diagnostic. */
- if (! x->recursive && errno == EPERM && is_dir_lstat (filename, st))
+ if (! x->recursive && errno == EPERM && is_dir_lstat (fd_cwd,
+ filename, st))
errno = EISDIR;
if (! x->recursive