From 6612a325230b6639ffee3e4519f93ba902886594 Mon Sep 17 00:00:00 2001 From: marecl Date: Thu, 20 Nov 2025 18:41:01 +0100 Subject: [PATCH] Prevent writing to directories (#3820) * Prevent writing to directories * Prevent writing to directories --- src/core/file_sys/directories/base_directory.h | 12 ++++++++++++ src/core/libraries/kernel/file_system.cpp | 11 +++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/core/file_sys/directories/base_directory.h b/src/core/file_sys/directories/base_directory.h index 8900ac32b..b412865a2 100644 --- a/src/core/file_sys/directories/base_directory.h +++ b/src/core/file_sys/directories/base_directory.h @@ -36,6 +36,18 @@ public: return ORBIS_KERNEL_ERROR_EBADF; } + virtual s64 write(const void* buf, u64 nbytes) { + return ORBIS_KERNEL_ERROR_EBADF; + } + + virtual s64 writev(const Libraries::Kernel::OrbisKernelIovec* iov, s32 iovcnt) { + return ORBIS_KERNEL_ERROR_EBADF; + } + + virtual s64 pwritev(const Libraries::Kernel::OrbisKernelIovec* iov, s32 iovcnt, s64 offset) { + return ORBIS_KERNEL_ERROR_EBADF; + } + virtual s64 lseek(s64 offset, s32 whence) { return ORBIS_KERNEL_ERROR_EBADF; } diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp index 7ded1f33e..b4c342f18 100644 --- a/src/core/libraries/kernel/file_system.cpp +++ b/src/core/libraries/kernel/file_system.cpp @@ -311,6 +311,9 @@ s64 PS4_SYSV_ABI write(s32 fd, const void* buf, u64 nbytes) { } else if (file->type == Core::FileSys::FileType::Socket) { // Socket functions handle errnos internally. return file->socket->SendPacket(buf, nbytes, 0, nullptr, 0); + } else if (file->type == Core::FileSys::FileType::Directory) { + *__Error() = POSIX_EBADF; + return -1; } return file->f.WriteRaw(buf, nbytes); @@ -405,7 +408,11 @@ s64 PS4_SYSV_ABI writev(s32 fd, const OrbisKernelIovec* iov, s32 iovcnt) { return -1; } return result; + } else if (file->type == Core::FileSys::FileType::Directory) { + *__Error() = POSIX_EBADF; + return -1; } + s64 total_written = 0; for (s32 i = 0; i < iovcnt; i++) { total_written += file->f.WriteRaw(iov[i].iov_base, iov[i].iov_len); @@ -1047,7 +1054,11 @@ s64 PS4_SYSV_ABI posix_pwritev(s32 fd, const OrbisKernelIovec* iov, s32 iovcnt, return -1; } return result; + } else if (file->type == Core::FileSys::FileType::Directory) { + *__Error() = POSIX_EBADF; + return -1; } + const s64 pos = file->f.Tell(); SCOPE_EXIT { file->f.Seek(pos);