From 1b4e88fb59d35d7d720de15ddbdd6975d7175964 Mon Sep 17 00:00:00 2001 From: Sergey Bugaev Date: Tue, 2 Jun 2020 19:20:05 +0300 Subject: [PATCH] Kernel: Allow File::close() to fail And pass the result through to sys$close() return value. Fixes https://github.com/SerenityOS/serenity/issues/427 --- Kernel/FileSystem/File.cpp | 3 ++- Kernel/FileSystem/File.h | 2 +- Kernel/FileSystem/FileDescription.cpp | 6 ++++-- Kernel/FileSystem/FileDescription.h | 2 +- Kernel/Net/IPv4Socket.cpp | 5 +++-- Kernel/Net/IPv4Socket.h | 2 +- Kernel/Net/TCPSocket.cpp | 5 +++-- Kernel/Net/TCPSocket.h | 2 +- Kernel/TTY/MasterPTY.cpp | 4 +++- Kernel/TTY/MasterPTY.h | 2 +- Kernel/TTY/SlavePTY.cpp | 3 ++- Kernel/TTY/SlavePTY.h | 2 +- 12 files changed, 23 insertions(+), 15 deletions(-) diff --git a/Kernel/FileSystem/File.cpp b/Kernel/FileSystem/File.cpp index c12b80db5b..594652d643 100644 --- a/Kernel/FileSystem/File.cpp +++ b/Kernel/FileSystem/File.cpp @@ -46,8 +46,9 @@ KResultOr> File::open(int options) return description; } -void File::close() +KResult File::close() { + return KSuccess; } int File::ioctl(FileDescription&, unsigned, FlatPtr) diff --git a/Kernel/FileSystem/File.h b/Kernel/FileSystem/File.h index 02fc614326..9fbcd94947 100644 --- a/Kernel/FileSystem/File.h +++ b/Kernel/FileSystem/File.h @@ -69,7 +69,7 @@ public: virtual ~File(); virtual KResultOr> open(int options); - virtual void close(); + virtual KResult close(); virtual bool can_read(const FileDescription&, size_t) const = 0; virtual bool can_write(const FileDescription&, size_t) const = 0; diff --git a/Kernel/FileSystem/FileDescription.cpp b/Kernel/FileSystem/FileDescription.cpp index 984eadfd50..4b76e4ca4a 100644 --- a/Kernel/FileSystem/FileDescription.cpp +++ b/Kernel/FileSystem/FileDescription.cpp @@ -256,9 +256,11 @@ MasterPTY* FileDescription::master_pty() return static_cast(m_file.ptr()); } -int FileDescription::close() +KResult FileDescription::close() { - return 0; + if (m_file->ref_count() > 1) + return KSuccess; + return m_file->close(); } String FileDescription::absolute_path() const diff --git a/Kernel/FileSystem/FileDescription.h b/Kernel/FileSystem/FileDescription.h index f3b8108083..767f270a95 100644 --- a/Kernel/FileSystem/FileDescription.h +++ b/Kernel/FileSystem/FileDescription.h @@ -65,7 +65,7 @@ public: set_writable(options & O_WRONLY); } - int close(); + KResult close(); off_t seek(off_t, int whence); ssize_t read(u8*, ssize_t); diff --git a/Kernel/Net/IPv4Socket.cpp b/Kernel/Net/IPv4Socket.cpp index 922e00e81a..02f7b38c87 100644 --- a/Kernel/Net/IPv4Socket.cpp +++ b/Kernel/Net/IPv4Socket.cpp @@ -564,9 +564,10 @@ int IPv4Socket::ioctl(FileDescription&, unsigned request, FlatPtr arg) return -EINVAL; } -void IPv4Socket::close() +KResult IPv4Socket::close() { - shutdown(SHUT_RDWR); + (void)shutdown(SHUT_RDWR); + return KSuccess; } void IPv4Socket::shut_down_for_reading() diff --git a/Kernel/Net/IPv4Socket.h b/Kernel/Net/IPv4Socket.h index 2d2963734b..7ed9e814d4 100644 --- a/Kernel/Net/IPv4Socket.h +++ b/Kernel/Net/IPv4Socket.h @@ -48,7 +48,7 @@ public: static Lockable>& all_sockets(); - virtual void close() override; + virtual KResult close() override; virtual KResult bind(const sockaddr*, socklen_t) override; virtual KResult connect(FileDescription&, const sockaddr*, socklen_t, ShouldBlock = ShouldBlock::Yes) override; virtual KResult listen(size_t) override; diff --git a/Kernel/Net/TCPSocket.cpp b/Kernel/Net/TCPSocket.cpp index a9c6441793..2b38b1d986 100644 --- a/Kernel/Net/TCPSocket.cpp +++ b/Kernel/Net/TCPSocket.cpp @@ -440,9 +440,9 @@ void TCPSocket::shut_down_for_writing() } } -void TCPSocket::close() +KResult TCPSocket::close() { - IPv4Socket::close(); + auto result = IPv4Socket::close(); if (state() == State::CloseWait) { #ifdef TCP_SOCKET_DEBUG dbg() << " Sending FIN from CloseWait and moving into LastAck"; @@ -453,6 +453,7 @@ void TCPSocket::close() LOCKER(closing_sockets().lock()); closing_sockets().resource().set(tuple(), *this); + return result; } } diff --git a/Kernel/Net/TCPSocket.h b/Kernel/Net/TCPSocket.h index 235063b295..b1710b54be 100644 --- a/Kernel/Net/TCPSocket.h +++ b/Kernel/Net/TCPSocket.h @@ -165,7 +165,7 @@ public: void release_to_originator(); void release_for_accept(RefPtr); - virtual void close() override; + virtual KResult close() override; protected: void set_direction(Direction direction) { m_direction = direction; } diff --git a/Kernel/TTY/MasterPTY.cpp b/Kernel/TTY/MasterPTY.cpp index ae7efb7635..8f00753bac 100644 --- a/Kernel/TTY/MasterPTY.cpp +++ b/Kernel/TTY/MasterPTY.cpp @@ -112,7 +112,7 @@ bool MasterPTY::can_write_from_slave() const return m_buffer.space_for_writing(); } -void MasterPTY::close() +KResult MasterPTY::close() { if (ref_count() == 2) { InterruptDisabler disabler; @@ -122,6 +122,8 @@ void MasterPTY::close() m_slave->hang_up(); } + + return KSuccess; } int MasterPTY::ioctl(FileDescription& description, unsigned request, FlatPtr arg) diff --git a/Kernel/TTY/MasterPTY.h b/Kernel/TTY/MasterPTY.h index 0dfc641d83..d77d4d42eb 100644 --- a/Kernel/TTY/MasterPTY.h +++ b/Kernel/TTY/MasterPTY.h @@ -54,7 +54,7 @@ private: virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override; virtual bool can_read(const FileDescription&, size_t) const override; virtual bool can_write(const FileDescription&, size_t) const override; - virtual void close() override; + virtual KResult close() override; virtual bool is_master_pty() const override { return true; } virtual int ioctl(FileDescription&, unsigned request, FlatPtr arg) override; virtual const char* class_name() const override { return "MasterPTY"; } diff --git a/Kernel/TTY/SlavePTY.cpp b/Kernel/TTY/SlavePTY.cpp index b53937621f..d81aa947cf 100644 --- a/Kernel/TTY/SlavePTY.cpp +++ b/Kernel/TTY/SlavePTY.cpp @@ -95,9 +95,10 @@ ssize_t SlavePTY::read(FileDescription& description, size_t offset, u8* buffer, return TTY::read(description, offset, buffer, size); } -void SlavePTY::close() +KResult SlavePTY::close() { m_master->notify_slave_closed({}); + return KSuccess; } } diff --git a/Kernel/TTY/SlavePTY.h b/Kernel/TTY/SlavePTY.h index 85b7391549..0e22a362ba 100644 --- a/Kernel/TTY/SlavePTY.h +++ b/Kernel/TTY/SlavePTY.h @@ -51,7 +51,7 @@ private: virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override; virtual bool can_write(const FileDescription&, size_t) const override; virtual const char* class_name() const override { return "SlavePTY"; } - virtual void close() override; + virtual KResult close() override; friend class MasterPTY; SlavePTY(MasterPTY&, unsigned index);