diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 6dab0e51b6..4fef1e77ff 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -339,6 +339,8 @@ void* Process::sys$mmap(const Syscall::SC_mmap_params* user_params) auto description = file_description(fd); if (!description) return (void*)-EBADF; + if (description->is_directory()) + return (void*)-ENODEV; if ((prot & PROT_READ) && !description->is_readable()) return (void*)-EACCES; if ((prot & PROT_WRITE) && !description->is_writable()) diff --git a/Userland/test_io.cpp b/Userland/test_io.cpp index dc8f1e7961..17fbb5e1f6 100644 --- a/Userland/test_io.cpp +++ b/Userland/test_io.cpp @@ -105,6 +105,22 @@ void test_ftruncate_negative() close(fd); } +void test_mmap_directory() +{ + int fd = open("/tmp", O_RDONLY | O_DIRECTORY); + ASSERT(fd >= 0); + auto* ptr = mmap(nullptr, 4096, PROT_READ, MAP_FILE | MAP_SHARED, fd, 0); + if (ptr != MAP_FAILED) { + fprintf(stderr, "Boo! mmap() of a directory succeeded!\n"); + return; + } + if (errno != ENODEV) { + fprintf(stderr, "Boo! mmap() of a directory gave errno=%d instead of ENODEV!\n", errno); + return; + } + close(fd); +} + int main(int, char**) { int rc; @@ -123,6 +139,7 @@ int main(int, char**) test_read_past_eof(); test_ftruncate_readonly(); test_ftruncate_negative(); + test_mmap_directory(); return 0; }