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 | |
parent | cfb32a6c81a6ca19115ab40bdfb5329cd0fffea8 (diff) | |
download | glibc-4bd8be48e95476aec7a483ba2f2830651108382c.tar.gz glibc-4bd8be48e95476aec7a483ba2f2830651108382c.tar.xz glibc-4bd8be48e95476aec7a483ba2f2830651108382c.zip |
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.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | sysdeps/unix/opendir.c | 38 |
2 files changed, 21 insertions, 22 deletions
diff --git a/ChangeLog b/ChangeLog index 13e3a1793b..c02c3a78cc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +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. + 1998-10-19 18:59 -0400 Zack Weinberg <zack@rabi.phys.columbia.edu> * math/tgmath.h (__TGMATH_UNARY_REAL_IMAG): Fix typo: val -> Val. 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; |