summaryrefslogtreecommitdiff
path: root/sysdeps/unix
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-10-19 16:30:28 +0000
committerUlrich Drepper <drepper@redhat.com>1998-10-19 16:30:28 +0000
commit4bd8be48e95476aec7a483ba2f2830651108382c (patch)
treee55faedf4fa3d1d95ac82f3cb38d57f5d94b64a5 /sysdeps/unix
parentcfb32a6c81a6ca19115ab40bdfb5329cd0fffea8 (diff)
downloadglibc-4bd8be48e95476aec7a483ba2f2830651108382c.tar.gz
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/unix')
-rw-r--r--sysdeps/unix/opendir.c38
1 files changed, 16 insertions, 22 deletions
diff --git a/sysdeps/unix/opendir.c b/sysdeps/unix/opendir.c
index 657ad176a8..067dc2cb59 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;