Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 5 Jan 2014 23:01:29 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r260355 - head/usr.bin/find
Message-ID:  <201401052301.s05N1TjX022655@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jilles
Date: Sun Jan  5 23:01:28 2014
New Revision: 260355
URL: http://svnweb.freebsd.org/changeset/base/260355

Log:
  find: Fix two more problems with -lname and -ilname:
  
  * Do not match symlinks that are followed because of -H or -L. This is
    explicitly documented in GNU find's info file and is like -type l.
  
  * Fix matching symlinks in subdirectories when fts changes directories.
  
  Also, avoid some readlink() calls on files that are obviously not symlinks
  (because of fts(3) restrictions, not all of them).
  
  MFC after:	1 week

Modified:
  head/usr.bin/find/find.1
  head/usr.bin/find/function.c

Modified: head/usr.bin/find/find.1
==============================================================================
--- head/usr.bin/find/find.1	Sun Jan  5 23:00:38 2014	(r260354)
+++ head/usr.bin/find/find.1	Sun Jan  5 23:01:28 2014	(r260355)
@@ -31,7 +31,7 @@
 .\"	@(#)find.1	8.7 (Berkeley) 5/9/95
 .\" $FreeBSD$
 .\"
-.Dd November 18, 2012
+.Dd January 5, 2014
 .Dt FIND 1
 .Os
 .Sh NAME
@@ -520,6 +520,8 @@ Like
 .Ic -name ,
 but the contents of the symbolic link are matched instead of the file
 name.
+Note that this only matches broken symbolic links
+if symbolic links are being followed.
 This is a GNU find extension.
 .It Ic -ls
 This primary always evaluates to true.

Modified: head/usr.bin/find/function.c
==============================================================================
--- head/usr.bin/find/function.c	Sun Jan  5 23:00:38 2014	(r260354)
+++ head/usr.bin/find/function.c	Sun Jan  5 23:01:28 2014	(r260355)
@@ -1125,7 +1125,17 @@ f_name(PLAN *plan, FTSENT *entry)
 	ssize_t len;
 
 	if (plan->flags & F_LINK) {
-		len = readlink(entry->fts_path, fn, sizeof(fn) - 1);
+		/*
+		 * The below test both avoids obviously useless readlink()
+		 * calls and ensures that symlinks with existent target do
+		 * not match if symlinks are being followed.
+		 * Assumption: fts will stat all symlinks that are to be
+		 * followed and will return the stat information.
+		 */
+		if (entry->fts_info != FTS_NSOK && entry->fts_info != FTS_SL &&
+		    entry->fts_info != FTS_SLNONE)
+			return 0;
+		len = readlink(entry->fts_accpath, fn, sizeof(fn) - 1);
 		if (len == -1)
 			return 0;
 		fn[len] = '\0';



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201401052301.s05N1TjX022655>