diff --git a/Kernel/Net/IPv4Socket.cpp b/Kernel/Net/IPv4Socket.cpp index 368557bb28862a..ad905678481ebb 100644 --- a/Kernel/Net/IPv4Socket.cpp +++ b/Kernel/Net/IPv4Socket.cpp @@ -82,30 +82,18 @@ IPv4Socket::~IPv4Socket() all_sockets().resource().remove(this); } -bool IPv4Socket::get_local_address(sockaddr* address, socklen_t* address_size) +void IPv4Socket::get_local_address(sockaddr* address, socklen_t* address_size) { - // FIXME: Look into what fallback behavior we should have here. - if (*address_size < sizeof(sockaddr_in)) - return false; - auto& ia = (sockaddr_in&)*address; - ia.sin_family = AF_INET; - ia.sin_port = htons(m_local_port); - memcpy(&ia.sin_addr, &m_local_address, sizeof(IPv4Address)); + sockaddr_in local_address = { AF_INET, htons(m_local_port), { m_local_address.to_in_addr_t() }, { 0 } }; + memcpy(address, &local_address, min(static_cast(*address_size), sizeof(sockaddr_in))); *address_size = sizeof(sockaddr_in); - return true; } -bool IPv4Socket::get_peer_address(sockaddr* address, socklen_t* address_size) +void IPv4Socket::get_peer_address(sockaddr* address, socklen_t* address_size) { - // FIXME: Look into what fallback behavior we should have here. - if (*address_size < sizeof(sockaddr_in)) - return false; - auto& ia = (sockaddr_in&)*address; - ia.sin_family = AF_INET; - ia.sin_port = htons(m_peer_port); - memcpy(&ia.sin_addr, &m_peer_address, sizeof(IPv4Address)); + sockaddr_in peer_address = { AF_INET, htons(m_peer_port), { m_peer_address.to_in_addr_t() }, { 0 } }; + memcpy(address, &peer_address, min(static_cast(*address_size), sizeof(sockaddr_in))); *address_size = sizeof(sockaddr_in); - return true; } KResult IPv4Socket::bind(const sockaddr* user_address, socklen_t address_size) diff --git a/Kernel/Net/IPv4Socket.h b/Kernel/Net/IPv4Socket.h index f38f90799aa2d0..fbdfa1b3756609 100644 --- a/Kernel/Net/IPv4Socket.h +++ b/Kernel/Net/IPv4Socket.h @@ -49,8 +49,8 @@ class IPv4Socket : public Socket { virtual KResult bind(const sockaddr*, socklen_t) override; virtual KResult connect(FileDescription&, const sockaddr*, socklen_t, ShouldBlock = ShouldBlock::Yes) override; virtual KResult listen(int) override; - virtual bool get_local_address(sockaddr*, socklen_t*) override; - virtual bool get_peer_address(sockaddr*, socklen_t*) override; + virtual void get_local_address(sockaddr*, socklen_t*) override; + virtual void get_peer_address(sockaddr*, socklen_t*) override; virtual void attach(FileDescription&) override; virtual void detach(FileDescription&) override; virtual bool can_read(const FileDescription&) const override; diff --git a/Kernel/Net/LocalSocket.cpp b/Kernel/Net/LocalSocket.cpp index 68269a82a05df9..a3643367991fa8 100644 --- a/Kernel/Net/LocalSocket.cpp +++ b/Kernel/Net/LocalSocket.cpp @@ -76,19 +76,16 @@ LocalSocket::~LocalSocket() all_sockets().resource().remove(this); } -bool LocalSocket::get_local_address(sockaddr* address, socklen_t* address_size) +void LocalSocket::get_local_address(sockaddr* address, socklen_t* address_size) { - // FIXME: Look into what fallback behavior we should have here. - if (*address_size != sizeof(sockaddr_un)) - return false; - memcpy(address, &m_address, sizeof(sockaddr_un)); + size_t bytes_to_copy = min(static_cast(*address_size), sizeof(sockaddr_un)); + memcpy(address, &m_address, bytes_to_copy); *address_size = sizeof(sockaddr_un); - return true; } -bool LocalSocket::get_peer_address(sockaddr* address, socklen_t* address_size) +void LocalSocket::get_peer_address(sockaddr* address, socklen_t* address_size) { - return get_local_address(address, address_size); + get_local_address(address, address_size); } KResult LocalSocket::bind(const sockaddr* user_address, socklen_t address_size) diff --git a/Kernel/Net/LocalSocket.h b/Kernel/Net/LocalSocket.h index 21b04f6463296a..e989884cc2b02d 100644 --- a/Kernel/Net/LocalSocket.h +++ b/Kernel/Net/LocalSocket.h @@ -47,8 +47,8 @@ class LocalSocket final : public Socket, public InlineLinkedListNodeget_peer_address(address, address_size); - ASSERT(success); + accepted_socket->get_peer_address(address, address_size); auto accepted_socket_description = FileDescription::create(*accepted_socket); accepted_socket_description->set_readable(true); accepted_socket_description->set_writable(true); @@ -3318,11 +3317,12 @@ int Process::get_sock_or_peer_name(const Params& params) u8 address_buffer[sizeof(sockaddr_un)]; addrlen_value = min(sizeof(sockaddr_un), static_cast(addrlen_value)); - - if (!socket.get_local_address((sockaddr*)address_buffer, &addrlen_value)) - return -EINVAL; - + if constexpr (sockname) + socket.get_local_address((sockaddr*)address_buffer, &addrlen_value); + else + socket.get_peer_address((sockaddr*)address_buffer, &addrlen_value); copy_to_user(params.addr, address_buffer, addrlen_value); + copy_to_user(params.addrlen, &addrlen_value); return 0; }