summaryrefslogtreecommitdiffstats
path: root/lib/libc/gen/opendir.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/gen/opendir.c')
-rw-r--r--lib/libc/gen/opendir.c38
1 files changed, 14 insertions, 24 deletions
diff --git a/lib/libc/gen/opendir.c b/lib/libc/gen/opendir.c
index 407c047..3beead7 100644
--- a/lib/libc/gen/opendir.c
+++ b/lib/libc/gen/opendir.c
@@ -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 *name, int flags)
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);
OpenPOWER on IntegriCloud