From 2bbb183a185125f300671d0ff6dc6c013936d673 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Tue, 13 Feb 2018 16:37:05 +0100 Subject: [PATCH] Libc: check O_DIRECTORY flag at 'open' and 'read' Return an error when opening a file with 'O_DIRECTORY'. Return an error when reading directories. Ref #2533 --- repos/libports/src/lib/libc/vfs_plugin.cc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/repos/libports/src/lib/libc/vfs_plugin.cc b/repos/libports/src/lib/libc/vfs_plugin.cc index 9de4eedb56..cf8d338df8 100644 --- a/repos/libports/src/lib/libc/vfs_plugin.cc +++ b/repos/libports/src/lib/libc/vfs_plugin.cc @@ -172,10 +172,12 @@ Libc::File_descriptor *Libc::Vfs_plugin::open(char const *path, int flags, if (_root_dir.directory(path)) { if (((flags & O_ACCMODE) != O_RDONLY)) { - errno = EINVAL; + errno = EISDIR; return nullptr; } + flags |= O_DIRECTORY; + Vfs::Vfs_handle *handle = 0; typedef Vfs::Directory_service::Opendir_result Opendir_result; @@ -208,6 +210,11 @@ Libc::File_descriptor *Libc::Vfs_plugin::open(char const *path, int flags, return fd; } + if (flags & O_DIRECTORY) { + errno = ENOTDIR; + return nullptr; + } + typedef Vfs::Directory_service::Open_result Result; Vfs::Vfs_handle *handle = 0; @@ -452,6 +459,9 @@ ssize_t Libc::Vfs_plugin::read(Libc::File_descriptor *fd, void *buf, Vfs::Vfs_handle *handle = vfs_handle(fd); + if (fd->flags & O_DIRECTORY) + return Errno(EISDIR); + if (fd->flags & O_NONBLOCK && !Libc::read_ready(fd)) return Errno(EAGAIN);