svn commit: r249401 - stable/9/lib/libc/gen
Jilles Tjoelker
jilles at FreeBSD.org
Fri Apr 12 11:37:25 UTC 2013
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);
More information about the svn-src-stable-9
mailing list