From 98c11ee33b503677ec33cfae3077d5c29c7c9daf Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 24 Aug 2026 17:30:01 +0300 Subject: [PATCH] Kernel: Support non-null-terminated paths in sockaddr_un --- kernel/kernel/Networking/UNIX/Socket.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/kernel/kernel/Networking/UNIX/Socket.cpp b/kernel/kernel/Networking/UNIX/Socket.cpp index 8162f0db..211dec76 100644 --- a/kernel/kernel/Networking/UNIX/Socket.cpp +++ b/kernel/kernel/Networking/UNIX/Socket.cpp @@ -21,7 +21,7 @@ namespace Kernel static BAN::ErrorOr validate_sockaddr_un(const sockaddr* address, socklen_t address_len) { - if (address_len < static_cast(sizeof(sa_family_t))) + if (address_len <= static_cast(sizeof(sa_family_t))) return BAN::Error::from_errno(EINVAL); if (address_len > static_cast(sizeof(sockaddr_un))) address_len = sizeof(sockaddr_un); @@ -30,13 +30,12 @@ namespace Kernel if (sockaddr_un.sun_family != AF_UNIX) return BAN::Error::from_errno(EINVAL); - size_t length = 0; - while (length < sizeof(sockaddr_un::sun_path) && sockaddr_un.sun_path[length]) - length++; - if (length >= sizeof(sockaddr_un::sun_path)) - return BAN::Error::from_errno(ENAMETOOLONG); - - return BAN::StringView { sockaddr_un.sun_path, length }; + auto sun_path = BAN::StringView { sockaddr_un.sun_path, address_len - sizeof(sa_family_t) }; + if (const auto null_idx = sun_path.find('\0'); null_idx.has_value()) + sun_path = sun_path.substring(0, null_idx.value()); + if (sun_path.empty()) + return BAN::Error::from_errno(EINVAL); + return sun_path; } BAN::ErrorOr> UnixDomainSocket::create(Socket::Type socket_type, const Socket::Info& info) @@ -264,14 +263,15 @@ namespace Kernel BAN::ErrorOr UnixDomainSocket::bind_impl(const sockaddr* address, socklen_t address_len) { const auto sun_path = TRY(validate_sockaddr_un(address, address_len)); - if (sun_path.empty()) - return BAN::Error::from_errno(EINVAL); + + BAN::String sun_path_nul; + TRY(sun_path_nul.append(sun_path)); // FIXME: This feels sketchy auto parent_file = sun_path.front() == '/' ? TRY(Process::current().root_file().clone()) : TRY(Process::current().working_directory().clone()); - if (auto ret = Process::current().create_file(AT_FDCWD, sun_path.data(), 0755 | Inode::Mode::IFSOCK); ret.is_error()) + if (auto ret = Process::current().create_file(AT_FDCWD, sun_path_nul.data(), 0755 | Inode::Mode::IFSOCK); ret.is_error()) { if (ret.error().get_error_code() == EEXIST) return BAN::Error::from_errno(EADDRINUSE);