diff --git a/Kernel/Net/IPv4Socket.cpp b/Kernel/Net/IPv4Socket.cpp index 7f21ea51597..439cc89e376 100644 --- a/Kernel/Net/IPv4Socket.cpp +++ b/Kernel/Net/IPv4Socket.cpp @@ -94,7 +94,7 @@ void IPv4Socket::get_peer_address(sockaddr* address, socklen_t* address_size) *address_size = sizeof(sockaddr_in); } -ErrorOr IPv4Socket::bind(Userspace user_address, socklen_t address_size) +ErrorOr IPv4Socket::bind(Credentials const& credentials, Userspace user_address, socklen_t address_size) { VERIFY(setup_state() == SetupState::Unstarted); if (address_size != sizeof(sockaddr_in)) @@ -107,9 +107,9 @@ ErrorOr IPv4Socket::bind(Userspace user_address, socklen_ return set_so_error(EINVAL); auto requested_local_port = ntohs(address.sin_port); - if (!Process::current().is_superuser()) { + if (!credentials.is_superuser()) { if (requested_local_port > 0 && requested_local_port < 1024) { - dbgln("UID {} attempted to bind {} to port {}", Process::current().uid(), class_name(), requested_local_port); + dbgln("UID {} attempted to bind {} to port {}", credentials.uid(), class_name(), requested_local_port); return set_so_error(EACCES); } } diff --git a/Kernel/Net/IPv4Socket.h b/Kernel/Net/IPv4Socket.h index 1eb3a9cca55..1376944f035 100644 --- a/Kernel/Net/IPv4Socket.h +++ b/Kernel/Net/IPv4Socket.h @@ -32,7 +32,7 @@ public: virtual ~IPv4Socket() override; virtual ErrorOr close() override; - virtual ErrorOr bind(Userspace, socklen_t) override; + virtual ErrorOr bind(Credentials const&, Userspace, socklen_t) override; virtual ErrorOr connect(OpenFileDescription&, Userspace, socklen_t) override; virtual ErrorOr listen(size_t) override; virtual void get_local_address(sockaddr*, socklen_t*) override; diff --git a/Kernel/Net/LocalSocket.cpp b/Kernel/Net/LocalSocket.cpp index a31c16e2423..9415bb7ab18 100644 --- a/Kernel/Net/LocalSocket.cpp +++ b/Kernel/Net/LocalSocket.cpp @@ -122,7 +122,7 @@ void LocalSocket::get_peer_address(sockaddr* address, socklen_t* address_size) get_local_address(address, address_size); } -ErrorOr LocalSocket::bind(Userspace user_address, socklen_t address_size) +ErrorOr LocalSocket::bind(Credentials const& credentials, Userspace user_address, socklen_t address_size) { VERIFY(setup_state() == SetupState::Unstarted); if (address_size > sizeof(sockaddr_un)) @@ -139,7 +139,7 @@ ErrorOr LocalSocket::bind(Userspace user_address, socklen mode_t mode = S_IFSOCK | (m_prebind_mode & 0777); UidAndGid owner { m_prebind_uid, m_prebind_gid }; - auto result = VirtualFileSystem::the().open(Process::current().credentials(), path->view(), O_CREAT | O_EXCL | O_NOFOLLOW_NOERROR, mode, Process::current().current_directory(), owner); + auto result = VirtualFileSystem::the().open(credentials, path->view(), O_CREAT | O_EXCL | O_NOFOLLOW_NOERROR, mode, Process::current().current_directory(), owner); if (result.is_error()) { if (result.error().code() == EEXIST) return set_so_error(EADDRINUSE); diff --git a/Kernel/Net/LocalSocket.h b/Kernel/Net/LocalSocket.h index 51f57c76b53..9b112aeca46 100644 --- a/Kernel/Net/LocalSocket.h +++ b/Kernel/Net/LocalSocket.h @@ -36,7 +36,7 @@ public: ErrorOr> pseudo_path(OpenFileDescription const& description) const override; // ^Socket - virtual ErrorOr bind(Userspace, socklen_t) override; + virtual ErrorOr bind(Credentials const&, Userspace, socklen_t) override; virtual ErrorOr connect(OpenFileDescription&, Userspace, socklen_t) override; virtual ErrorOr listen(size_t) override; virtual void get_local_address(sockaddr*, socklen_t*) override; diff --git a/Kernel/Net/Socket.h b/Kernel/Net/Socket.h index df17360deee..22fc9393466 100644 --- a/Kernel/Net/Socket.h +++ b/Kernel/Net/Socket.h @@ -72,7 +72,7 @@ public: ErrorOr shutdown(int how); - virtual ErrorOr bind(Userspace, socklen_t) = 0; + virtual ErrorOr bind(Credentials const&, Userspace, socklen_t) = 0; virtual ErrorOr connect(OpenFileDescription&, Userspace, socklen_t) = 0; virtual ErrorOr listen(size_t) = 0; virtual void get_local_address(sockaddr*, socklen_t*) = 0; diff --git a/Kernel/Syscalls/socket.cpp b/Kernel/Syscalls/socket.cpp index f0491f10960..bd45d54e7bb 100644 --- a/Kernel/Syscalls/socket.cpp +++ b/Kernel/Syscalls/socket.cpp @@ -56,7 +56,7 @@ ErrorOr Process::sys$bind(int sockfd, Userspace addres return ENOTSOCK; auto& socket = *description->socket(); REQUIRE_PROMISE_FOR_SOCKET_DOMAIN(socket.domain()); - TRY(socket.bind(address, address_length)); + TRY(socket.bind(credentials(), address, address_length)); return 0; }