aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2012-12-10 01:48:02 -0600
committerRob Landley <rob@landley.net>2012-12-10 01:48:02 -0600
commitb9bde7b403a8dcf8e8a1417383bb70816a7c1958 (patch)
tree8c8c55d4b26bdb8b322ce1b481f535ddbeb1143e
parentd52e76d50879542702b89cc8cc873358232d2e3f (diff)
downloadtoybox-b9bde7b403a8dcf8e8a1417383bb70816a7c1958.tar.gz
essat's flag not to follow symlinks isn't in the system call, and if libc is supposed to implement this as a wrapper uClibc gets it wrong. So use the stat info about symlinks instead. (Doesn't check the parent directory, but if that's read only we can't delete the file anyway so prompting is moot.)
-rw-r--r--toys/posix/rm.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/toys/posix/rm.c b/toys/posix/rm.c
index dae5eee4..59d5061b 100644
--- a/toys/posix/rm.c
+++ b/toys/posix/rm.c
@@ -35,8 +35,8 @@ static int do_rm(struct dirtree *try)
if (dir && !(flags & (FLAG_r|FLAG_R))) goto skip;
// This is either the posix section 2(b) prompt or the section 3 prompt.
- if (!(flags & FLAG_f) && faccessat(fd, try->name, W_OK, AT_SYMLINK_NOFOLLOW))
- or++;
+ if (!(flags & FLAG_f)
+ && (!S_ISLNK(try->st.st_mode) && faccessat(fd, try->name, W_OK, 0))) or++;
if (!(dir && try->data == -1) && ((or && isatty(0)) || (flags & FLAG_i))) {
char *s = dirtree_path(try, 0);
fprintf(stderr, "rm %s%s", or ? "ro " : "", dir ? "dir " : "");