aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtests/find.test4
-rw-r--r--toys/posix/find.c36
2 files changed, 24 insertions, 16 deletions
diff --git a/tests/find.test b/tests/find.test
index cbbce5fd..65bbb501 100755
--- a/tests/find.test
+++ b/tests/find.test
@@ -39,4 +39,8 @@ testing "find -type f -a -print" \
testing "find -print -o -print" \
"find dir -type f -a \( -print -o -print \)" "dir/file\n" "" ""
+# these were erroring or segfaulting:
+# find -type f -user nobody -exec : \;
+# find -type f -user nobody -exec : -exec : \;
+
rm -rf dir
diff --git a/toys/posix/find.c b/toys/posix/find.c
index 10585294..aca19845 100644
--- a/toys/posix/find.c
+++ b/toys/posix/find.c
@@ -336,26 +336,30 @@ static int do_find(struct dirtree *new)
} u;
} *udl;
- if (!new && ss[1]) {
- udl = xmalloc(sizeof(*udl));
- dlist_add_nomalloc(&TT.argdata, (void *)udl);
+ if (!new) {
+ if (ss[1]) {
+ udl = xmalloc(sizeof(*udl));
+ dlist_add_nomalloc(&TT.argdata, (void *)udl);
- if (*s == 'u') udl->u.uid = xgetpwnamid(ss[1])->pw_uid;
- else if (*s == 'g') udl->u.gid = xgetgrnamid(ss[1])->gr_gid;
- else {
- struct stat st;
+ if (*s == 'u') udl->u.uid = xgetpwnamid(ss[1])->pw_uid;
+ else if (*s == 'g') udl->u.gid = xgetgrnamid(ss[1])->gr_gid;
+ else {
+ struct stat st;
- xstat(ss[1], &st);
- udl->u.tm = st.st_mtim;
+ xstat(ss[1], &st);
+ udl->u.tm = st.st_mtim;
+ }
}
- } else if (check) {
+ } else {
udl = (void *)llist_pop(&argdata);
- if (*s == 'u') test = new->st.st_uid == udl->u.uid;
- else if (*s == 'g') test = new->st.st_gid == udl->u.gid;
- else {
- test = new->st.st_mtim.tv_sec > udl->u.tm.tv_sec;
- if (new->st.st_mtim.tv_sec == udl->u.tm.tv_sec)
- test = new->st.st_mtim.tv_nsec > udl->u.tm.tv_nsec;
+ if (check) {
+ if (*s == 'u') test = new->st.st_uid == udl->u.uid;
+ else if (*s == 'g') test = new->st.st_gid == udl->u.gid;
+ else {
+ test = new->st.st_mtim.tv_sec > udl->u.tm.tv_sec;
+ if (new->st.st_mtim.tv_sec == udl->u.tm.tv_sec)
+ test = new->st.st_mtim.tv_nsec > udl->u.tm.tv_nsec;
+ }
}
}
} else if (!strcmp(s, "exec") || !strcmp("ok", s)