From 4bd8be48e95476aec7a483ba2f2830651108382c Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 19 Oct 1998 16:30:28 +0000 Subject: Update. 1998-10-19 Ulrich Drepper * sysdeps/unix/opendir.c (__opendir): Add back fstat call to make sure that descriptor is in any case for a directory. --- sysdeps/unix/opendir.c | 38 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 22 deletions(-) (limited to 'sysdeps/unix/opendir.c') 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 -/* 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; -- cgit v1.2.3