[Bug 222698] find(1)'s -newer expression doesn't work with symbolic links if '-P' (the default) is requested.

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Sat Sep 30 12:37:19 UTC 2017


https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=222698

            Bug ID: 222698
           Summary: find(1)'s -newer expression doesn't work with symbolic
                    links if '-P' (the default) is requested.
           Product: Base System
           Version: 11.1-STABLE
          Hardware: Any
                OS: Any
            Status: New
          Severity: Affects Many People
          Priority: ---
         Component: bin
          Assignee: freebsd-bugs at FreeBSD.org
          Reporter: bugzilla.freebsd at omnilan.de

Utilizing find(1)'s 'newer' primary expression is broken with symbolic links.

According to the man page, -P should be the default behaviour, but even if
explicitly defining -P, find uses timestamp information from the file
referenced by the link, not the link itself.

To see in action (copy'n'pastable for sh and csh):

[ -e /tmp/find-test ] && rm -R /tmp/find-test
mkdir /tmp/find-test && cd /tmp/find-test
ln -s fILE lINK-to-fILE && sleep 1
echo "Created after lINK-to-fILE" > fILE2 && sleep 1
echo "Newest in the hood" > fILE && sleep 1
find . -newermm lINK-to-fILE

It doesn't return fILE2 nor fILE, while stat(1) clearly confirms newer m_times
for fILE and fILE2 compared to lINK-to-fILE ( 'stat -f "%N: %Sm" *' ).

It's possible that find(1) hasn't been working like expected for a quiet long
time.  I first recognized strange results arround FreeBSD 8.0 but haven't had
time|need to investigate.
More precisely, I thought that the error was in my backup script due to
timestamp precision changes, which changed around that time if I remember
correctly.  But since timestamp comparings is a fallback mechanism in my
script, never needed until yesterday in real world, I haven't paid any
attention until today.

To falsify find(1)'s misbehaviour, continue the test above with:

touch -m -t `stat -f %Sm -t %y%m%d%H%M.%S lINK-to-fILE` fILE
find . -newermm lINK-to-fILE

Now you get the result which was expected before.

Why don't I just use 'touch -r' ?  Well, tried that of course, but I had to
find out that touch(1) is not using the m_time of the link, but from the file
referenced by the link.  touch(1) hasn't options which influence that and
doesn't state default behaviour...

Will see if I can identify the problem in the source of find(1) and add
comments as soon as I found anything.
But I hope people with better C skills jump in!

Even if it's a old bug, it's a very nasty one, because it can affect user's
data...  So high priority IMHO.

-harry

-- 
You are receiving this mail because:
You are the assignee for the bug.


More information about the freebsd-bugs mailing list