diff options
author | Ulrich Drepper <drepper@redhat.com> | 1998-10-19 16:30:28 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1998-10-19 16:30:28 +0000 |
commit | 4bd8be48e95476aec7a483ba2f2830651108382c (patch) | |
tree | e55faedf4fa3d1d95ac82f3cb38d57f5d94b64a5 /sysdeps | |
parent | cfb32a6c81a6ca19115ab40bdfb5329cd0fffea8 (diff) | |
download | glibc-4bd8be48e95476aec7a483ba2f2830651108382c.zip glibc-4bd8be48e95476aec7a483ba2f2830651108382c.tar.gz glibc-4bd8be48e95476aec7a483ba2f2830651108382c.tar.bz2 |
Update.
1998-10-19 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/opendir.c (__opendir): Add back fstat call to make
sure that descriptor is in any case for a directory.
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/unix/opendir.c | 38 |
1 files changed, 16 insertions, 22 deletions
diff --git a/sysdeps/unix/opendir.c b/sysdeps/unix/opendir.c index 657ad17..067dc2c 100644 --- a/sysdeps/unix/opendir.c +++ b/sysdeps/unix/opendir.c @@ -30,26 +30,8 @@ #include <dirstream.h> -/* We want to be really safe the file we opened is a directory. Some systems - have support for this, others don't. */ -#ifdef O_DIRECTORY -# define OPENDIR(NAME) \ - do { \ - fd = __open (NAME, O_RDONLY|O_NDELAY|O_DIRECTORY); \ - if (fd < 0) \ - return NULL; \ - } while (0) -#else -# define OPENDIR(NAME) \ - do { \ - fd = __open (NAME, O_RDONLY|O_NDELAY); \ - if (fd < 0 || __fstat (fd, &statbuf) < 0 || ! S_ISDIR (statbuf.st_mode)) \ - { \ - if (fd >= 0) \ - __close (fd); \ - return NULL; \ - } \ - } while (0) +#ifndef O_DIRECTORY +# define O_DIRECTORY 0 #endif @@ -74,7 +56,7 @@ __opendir (const char *name) /* We first have to check whether the name is for a directory. We cannot do this after the open() call since the open/close operation performed on, say, a tape device might have undesirable effects. */ - if (stat (name, &statbuf) < 0) + if (__stat (name, &statbuf) < 0) return NULL; if (! S_ISDIR (statbuf.st_mode)) { @@ -82,7 +64,19 @@ __opendir (const char *name) return NULL; } - OPENDIR (name); + fd = __open (name, O_RDONLY|O_NDELAY|O_DIRECTORY); + if (fd < 0) + return NULL; + + /* Now make sure this really is a directory and nothing changed since + the `stat' call. */ + if (__fstat (fd, &statbuf) < 0) + goto lose; + if (! S_ISDIR (statbuf.st_mode)) + { + save_errno = ENOTDIR; + goto lose; + } if (__fcntl (fd, F_SETFD, FD_CLOEXEC) < 0) goto lose; |