From owner-svn-src-all@FreeBSD.ORG Tue Jan 14 21:35:26 2014 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 728349CF; Tue, 14 Jan 2014 21:35:26 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 443941C87; Tue, 14 Jan 2014 21:35:26 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id s0ELZQnS076328; Tue, 14 Jan 2014 21:35:26 GMT (envelope-from jilles@svn.freebsd.org) Received: (from jilles@localhost) by svn.freebsd.org (8.14.7/8.14.7/Submit) id s0ELZPVT076326; Tue, 14 Jan 2014 21:35:25 GMT (envelope-from jilles@svn.freebsd.org) Message-Id: <201401142135.s0ELZPVT076326@svn.freebsd.org> From: Jilles Tjoelker Date: Tue, 14 Jan 2014 21:35:25 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org Subject: svn commit: r260651 - stable/9/usr.bin/find X-SVN-Group: stable-9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 14 Jan 2014 21:35:26 -0000 Author: jilles Date: Tue Jan 14 21:35:25 2014 New Revision: 260651 URL: http://svnweb.freebsd.org/changeset/base/260651 Log: MFC r260336,r260355: find: Fix -lname and -ilname: * Take into account that readlink() does not add a terminating '\0'. * 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. As before, symlinks of length PATH_MAX or more are not handled correctly. (These can only be created on other operating systems.) Also, avoid some readlink() calls on files that are obviously not symlinks (because of fts(3) restrictions, not all of them). PR: bin/185393 Submitted by: Ben Reser (parts, original version) Modified: stable/9/usr.bin/find/find.1 stable/9/usr.bin/find/function.c Directory Properties: stable/9/usr.bin/find/ (props changed) Modified: stable/9/usr.bin/find/find.1 ============================================================================== --- stable/9/usr.bin/find/find.1 Tue Jan 14 21:20:51 2014 (r260650) +++ stable/9/usr.bin/find/find.1 Tue Jan 14 21:35:25 2014 (r260651) @@ -31,7 +31,7 @@ .\" @(#)find.1 8.7 (Berkeley) 5/9/95 .\" $FreeBSD$ .\" -.Dd September 9, 2012 +.Dd January 5, 2014 .Dt FIND 1 .Os .Sh NAME @@ -502,6 +502,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: stable/9/usr.bin/find/function.c ============================================================================== --- stable/9/usr.bin/find/function.c Tue Jan 14 21:20:51 2014 (r260650) +++ stable/9/usr.bin/find/function.c Tue Jan 14 21:35:25 2014 (r260651) @@ -1082,11 +1082,24 @@ f_name(PLAN *plan, FTSENT *entry) { char fn[PATH_MAX]; const char *name; + ssize_t len; if (plan->flags & F_LINK) { - name = fn; - if (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'; + name = fn; } else name = entry->fts_name; return !fnmatch(plan->c_data, name,