On Thu, 27 Sep 2018 at 11:06, Evan Gates <evan.ga...@gmail.com> wrote:
> On Wed, Sep 26, 2018 at 5:49 PM Tavian Barnes <taviana...@tavianator.com> 
> wrote:
> >
> > Hi!  As the author of a find-compatible tool, whenever I find another
> > find implementation I run my testsuite against it to see if I find any
> > bugs in either one.  sbase/find helped me identify many places in my
> > POSIX tests that use extensions to POSIX when they shouldn't, so
> > thanks!
>
> Awesome!  Those extensions sneak in don't they?

Yeah they sure do.

> [snip]
> Interesting.  It looks like we'd have to either cd() or fstatat().  I'm
> thinking we could use dirfd() to get an fd from the DIR* we already have.
> Then we could pass the fd along in order to use fstatat().  If not for the
> -path primary we could just pass the fd and the filename when recursing.
> But because of -path it would probably make the most sense to pass the
> fd, filename, and full path.

fstatat() is better than chdir() IMO.  Can't forget to chdir() back in
-exec for example.  Your coding style says you use POSIX 2008 so we
can rely on it.  There's additional complications if you want to
handle directory structures deeper than OPEN_MAX.

Any objections to changing find.c to use recurse()?  That way this
could be fixed for a few tools at once.

> > Despite that, it exits successfully, which is probably also a bug.
>
> Good point.  I wanted to keep on processing instead of exiting
> immediately, but it makes sense to set a flag so we exit failure.

Makes sense!

> [snip]
> > foo/baz is not newer than itself though.
>
> Well that's just weird.  In a brief look at the code I'm not sure why
> that's happening.

Looks like stat() instead of lstat() in get_newer_arg().  A strict
reading of the POSIX spec implies it should always be lstat() (the
-H/-L docs speak only about the path operands, not other arguments
that happen to be paths), but I don't know of any find implementations
that do that.  GNU find and several others respect -H/-L for whether
to follow symbolic links passed to -newer.  But the POSIX conformance
tests check for this.

> > - find -perm doesn't support X -
> >
> > $ ./find . -perm a+rX,u+w
> > ./find: a+rX,u+w: invalid mode
>
> That seems to be missing from libutil/mode.c

I see.  So this is missing from sbase/chmod too I guess.  Guess I can
fix both at once :)

> [snip]
> Always happy to see someone excited about sbase.  Thanks for reporting
> the bugs.  Would you be interested in submitting patches, too?  That would
> be most helpful.  You can think of it as an excuse to see the inner
> workings of another find implementation :-)

Yep, I'll start digging into it.

-- 
Tavian Barnes

Reply via email to