Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 12 Apr 2013 11:37:24 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r249401 - stable/9/lib/libc/gen
Message-ID:  <201304121137.r3CBbOKf080338@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jilles
Date: Fri Apr 12 11:37:24 2013
New Revision: 249401
URL: http://svnweb.freebsd.org/changeset/base/249401

Log:
  MFC r232385 by ru: Remove 3 syscalls from opendir().
  
  Finally removed the stat() and fstat() calls from the opendir() code.
  They were made excessive in r205424 by opening with O_DIRECTORY.
  Also eliminated the fcntl() call used to set FD_CLOEXEC by opening
  with O_CLOEXEC.
  
  (fdopendir() still checks that the passed descriptor is a directory,
  and sets FD_CLOEXEC on it.)
  
  The necessary kernel support for O_DIRECTORY and O_CLOEXEC was already in
  9.0-RELEASE.
  
  Discussed with:	ru

Modified:
  stable/9/lib/libc/gen/opendir.c
Directory Properties:
  stable/9/lib/libc/   (props changed)

Modified: stable/9/lib/libc/gen/opendir.c
==============================================================================
--- stable/9/lib/libc/gen/opendir.c	Fri Apr 12 08:52:19 2013	(r249400)
+++ stable/9/lib/libc/gen/opendir.c	Fri Apr 12 11:37:24 2013	(r249401)
@@ -66,7 +66,17 @@ opendir(const char *name)
 DIR *
 fdopendir(int fd)
 {
+	struct stat statb;
 
+	/* Check that fd is associated with a directory. */
+	if (_fstat(fd, &statb) != 0)
+		return (NULL);
+	if (!S_ISDIR(statb.st_mode)) {
+		errno = ENOTDIR;
+		return (NULL);
+	}
+	if (_fcntl(fd, F_SETFD, FD_CLOEXEC) == -1)
+		return (NULL);
 	return (__opendir_common(fd, NULL, DTF_HIDEW|DTF_NODUP));
 }
 
@@ -74,19 +84,9 @@ DIR *
 __opendir2(const char *name, int flags)
 {
 	int fd;
-	struct stat statb;
 
-	/*
-	 * stat() before _open() because opening of special files may be
-	 * harmful.
-	 */
-	if (stat(name, &statb) != 0)
-		return (NULL);
-	if (!S_ISDIR(statb.st_mode)) {
-		errno = ENOTDIR;
-		return (NULL);
-	}
-	if ((fd = _open(name, O_RDONLY | O_NONBLOCK | O_DIRECTORY)) == -1)
+	if ((fd = _open(name,
+	    O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_CLOEXEC)) == -1)
 		return (NULL);
 
 	return __opendir_common(fd, name, flags);
@@ -110,19 +110,9 @@ __opendir_common(int fd, const char *nam
 	int incr;
 	int saved_errno;
 	int unionstack;
-	struct stat statb;
 
-	dirp = NULL;
-	/* _fstat() the open handler because the file may have changed.  */
-	if (_fstat(fd, &statb) != 0)
-		goto fail;
-	if (!S_ISDIR(statb.st_mode)) {
-		errno = ENOTDIR;
-		goto fail;
-	}
-	if (_fcntl(fd, F_SETFD, FD_CLOEXEC) == -1 ||
-	    (dirp = malloc(sizeof(DIR) + sizeof(struct _telldir))) == NULL)
-		goto fail;
+	if ((dirp = malloc(sizeof(DIR) + sizeof(struct _telldir))) == NULL)
+		return (NULL);
 
 	dirp->dd_td = (struct _telldir *)((char *)dirp + sizeof(DIR));
 	LIST_INIT(&dirp->dd_td->td_locq);



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