Date: Wed, 27 Mar 1996 10:23:22 -0800 (PST) From: Bruce Evans <bde> To: bugs@freebsd.org Subject: opendir() broken for special files Message-ID: <199603271823.KAA15122@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
opendir() attempts to open files before [f]stat()'ing them. This causes
problems for special files for which open() has side effects. Try
something like `echo /dev/nrst0/*' or `echo /dev/*/*' with a shell that
tries opendir() on non-directories, e.g., bash (bash is apparently trying
to avoid a syscall for the case where the file is a directory).
I don't see a better fix than stat()ing the file in opendir().
Bruce
diff -c2 src/lib/libc/gen/opendir.c~ src/lib/libc/gen/opendir.c
*** src/lib/libc/gen/opendir.c~ Sun Apr 16 20:22:58 1995
--- src/lib/libc/gen/opendir.c Wed Mar 27 17:40:22 1996
***************
*** 57,60 ****
--- 57,70 ----
struct stat sb;
+ /*
+ * stat() before open() because opening of special files may be
+ * harmful. fstat() after open because the file may have changed.
+ */
+ if (stat(name, &sb) != 0)
+ return NULL;
+ if (!S_ISDIR(sb.st_mode)) {
+ errno = ENOTDIR;
+ return NULL;
+ }
if ((fd = open(name, O_RDONLY | O_NONBLOCK)) == -1)
return NULL;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199603271823.KAA15122>
