From 920b4416c147ecb76731137158da8bcc9041fecd Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Sat, 22 Sep 2007 08:40:47 +0200 Subject: 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 --- src/remove.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src') 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 -- cgit v1.2.3-70-g09d2