Author: ru
Date: Fri Mar  2 10:03:38 2012
New Revision: 232385
URL: http://svn.freebsd.org/changeset/base/232385

Log:
  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.)
  
  Reviewed by:  ed

Modified:
  head/lib/libc/gen/opendir.c

Modified: head/lib/libc/gen/opendir.c
==============================================================================
--- head/lib/libc/gen/opendir.c Fri Mar  2 09:52:42 2012        (r232384)
+++ head/lib/libc/gen/opendir.c Fri Mar  2 10:03:38 2012        (r232385)
@@ -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,21 +84,11 @@ DIR *
 __opendir2(const char *name, int flags)
 {
        int fd;
-       struct stat statb;
        DIR *dir;
        int saved_errno;
 
-       /*
-        * 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);
 
        dir = __opendir_common(fd, name, flags);
@@ -119,19 +119,9 @@ __opendir_common(int fd, const char *nam
        int saved_errno;
        int unionstack;
        int fd2;
-       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);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to