aboutsummaryrefslogtreecommitdiff
path: root/toys/posix/rm.c
diff options
context:
space:
mode:
Diffstat (limited to 'toys/posix/rm.c')
-rw-r--r--toys/posix/rm.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/toys/posix/rm.c b/toys/posix/rm.c
index eec586c5..b1fd0fee 100644
--- a/toys/posix/rm.c
+++ b/toys/posix/rm.c
@@ -90,6 +90,7 @@ nodelete:
void rm_main(void)
{
char **s;
+ struct stat st;
// Can't use <1 in optstring because zero arguments with -f isn't an error
if (!toys.optc && !FLAG(f)) help_exit("Needs 1 argument");
@@ -105,9 +106,10 @@ void rm_main(void)
continue;
}
- // Files that already don't exist aren't errors for -f, so try a quick
- // unlink now to see if it succeeds or reports that it didn't exist.
- if (FLAG(f) && (!unlink(*s) || errno == ENOENT)) continue;
+ // Files that already don't exist aren't errors for -f.
+ // We explicitly use lstat() but not faccessat() because Android bionic
+ // intentionally don't support AT_SYMLINK_NOFOLLOW.
+ if (FLAG(f) && lstat(*s, &st) && errno == ENOENT) continue;
// There's a race here where a file removed between the above check and
// dirtree's stat would report the nonexistence as an error, but that's