aboutsummaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorJilles Tjoelker <jilles@FreeBSD.org>2013-08-02 14:14:23 +0000
committerJilles Tjoelker <jilles@FreeBSD.org>2013-08-02 14:14:23 +0000
commit9d6d5a71313e9970cfbf872a197eb25f5c67948d (patch)
treef1d1b1c80bcd2cc9448bebfd654a13bad4a76f6c /usr.bin
parent977c7043eb5c0d074bfb7fe97f7c23eed2b2ec28 (diff)
downloadsrc-9d6d5a71313e9970cfbf872a197eb25f5c67948d.tar.gz
src-9d6d5a71313e9970cfbf872a197eb25f5c67948d.zip
find: Allow -delete to delete files given as arguments.
Formerly, a command like find dir1/dir2 -delete would delete everything under dir1/dir2 but not dir1/dir2 itself. When -L is not specified and "." can be opened, the fts(3) code underlying find(1) is careful to avoid following symlinks or being dropped in different locations by moving the directory fts is currently traversing. If a problematic concurrent modification is detected, fts will not enter the directory or abort. Files found in the search are returned via the current working directory and a pathname not containing a slash. For paranoia, find(1) verifies this when -delete is used. However, it is too paranoid about the root of the traversal. It is already assumed that the initial pathname does not refer to directories or symlinks that might be replaced by untrusted users; otherwise, the whole traversal would be unsafe. Therefore, it is not necessary to do the check for fts_level == FTS_ROOTLEVEL. Deleting the pathnames given as arguments can be prevented without error messages using -mindepth 1 or by changing directory and passing "." as argument to find. This works in the old as well as the new version of find. Tested by: Kurt Lidl Reviewed by: jhb
Notes
Notes: svn path=/head/; revision=253886
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/find/function.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/usr.bin/find/function.c b/usr.bin/find/function.c
index 7f16a8f1892a..56d361cd575b 100644
--- a/usr.bin/find/function.c
+++ b/usr.bin/find/function.c
@@ -442,7 +442,8 @@ f_delete(PLAN *plan __unused, FTSENT *entry)
errx(1, "-delete: forbidden when symlinks are followed");
/* Potentially unsafe - do not accept relative paths whatsoever */
- if (strchr(entry->fts_accpath, '/') != NULL)
+ if (entry->fts_level > FTS_ROOTLEVEL &&
+ strchr(entry->fts_accpath, '/') != NULL)
errx(1, "-delete: %s: relative path potentially not safe",
entry->fts_accpath);