diff --git a/Tests/LibCore/TestLibCoreStream.cpp b/Tests/LibCore/TestLibCoreStream.cpp index 13d086efc4..945302791a 100644 --- a/Tests/LibCore/TestLibCoreStream.cpp +++ b/Tests/LibCore/TestLibCoreStream.cpp @@ -291,7 +291,9 @@ TEST_CASE(udp_socket_read_write) usleep(100000); struct sockaddr_in client_address; - auto server_receive_buffer = udp_server->receive(64, client_address); + auto server_receive_buffer_or_error = udp_server->receive(64, client_address); + EXPECT(!server_receive_buffer_or_error.is_error()); + auto server_receive_buffer = server_receive_buffer_or_error.release_value(); EXPECT(!server_receive_buffer.is_empty()); StringView server_received_data { server_receive_buffer.bytes() }; diff --git a/Userland/Libraries/LibCore/UDPServer.cpp b/Userland/Libraries/LibCore/UDPServer.cpp index 729b640de6..da46081c19 100644 --- a/Userland/Libraries/LibCore/UDPServer.cpp +++ b/Userland/Libraries/LibCore/UDPServer.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2020, Andreas Kling + * Copyright (c) 2022, Alexander Narsudinov * * SPDX-License-Identifier: BSD-2-Clause */ @@ -7,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -61,18 +63,12 @@ bool UDPServer::bind(IPv4Address const& address, u16 port) return true; } -ByteBuffer UDPServer::receive(size_t size, sockaddr_in& in) +ErrorOr UDPServer::receive(size_t size, sockaddr_in& in) { - // FIXME: Handle possible OOM situation. - auto buf = ByteBuffer::create_uninitialized(size).release_value_but_fixme_should_propagate_errors(); + auto buf = TRY(ByteBuffer::create_uninitialized(size)); socklen_t in_len = sizeof(in); - ssize_t rlen = ::recvfrom(m_fd, buf.data(), size, 0, (sockaddr*)&in, &in_len); - if (rlen < 0) { - dbgln("recvfrom: {}", strerror(errno)); - return {}; - } - - buf.resize(rlen); + auto bytes_received = TRY(Core::System::recvfrom(m_fd, buf.data(), size, 0, (sockaddr*)&in, &in_len)); + buf.resize(bytes_received); return buf; } diff --git a/Userland/Libraries/LibCore/UDPServer.h b/Userland/Libraries/LibCore/UDPServer.h index 50ac61ee31..53e1407c57 100644 --- a/Userland/Libraries/LibCore/UDPServer.h +++ b/Userland/Libraries/LibCore/UDPServer.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2020, Andreas Kling + * Copyright (c) 2022, Alexander Narsudinov * * SPDX-License-Identifier: BSD-2-Clause */ @@ -23,8 +24,8 @@ public: bool is_bound() const { return m_bound; } bool bind(IPv4Address const& address, u16 port); - ByteBuffer receive(size_t size, sockaddr_in& from); - ByteBuffer receive(size_t size) + ErrorOr receive(size_t size, sockaddr_in& from); + ErrorOr receive(size_t size) { struct sockaddr_in saddr; return receive(size, saddr); diff --git a/Userland/Services/DHCPClient/DHCPv4Client.cpp b/Userland/Services/DHCPClient/DHCPv4Client.cpp index 0542c780a1..8d2d4c4231 100644 --- a/Userland/Services/DHCPClient/DHCPv4Client.cpp +++ b/Userland/Services/DHCPClient/DHCPv4Client.cpp @@ -122,7 +122,8 @@ DHCPv4Client::DHCPv4Client(Vector interfaces_with_dhcp_enabled { m_server = Core::UDPServer::construct(this); m_server->on_ready_to_receive = [this] { - auto buffer = m_server->receive(sizeof(DHCPv4Packet)); + // TODO: we need to handle possible errors here somehow + auto buffer = MUST(m_server->receive(sizeof(DHCPv4Packet))); dbgln_if(DHCPV4CLIENT_DEBUG, "Received {} bytes", buffer.size()); if (buffer.size() < sizeof(DHCPv4Packet) - DHCPV4_OPTION_FIELD_MAX_LENGTH + 1 || buffer.size() > sizeof(DHCPv4Packet)) { dbgln("we expected {}-{} bytes, this is a bad packet", sizeof(DHCPv4Packet) - DHCPV4_OPTION_FIELD_MAX_LENGTH + 1, sizeof(DHCPv4Packet)); diff --git a/Userland/Services/LookupServer/DNSServer.cpp b/Userland/Services/LookupServer/DNSServer.cpp index 8e73fe617c..0ef59a97b9 100644 --- a/Userland/Services/LookupServer/DNSServer.cpp +++ b/Userland/Services/LookupServer/DNSServer.cpp @@ -28,7 +28,7 @@ DNSServer::DNSServer(Object* parent) ErrorOr DNSServer::handle_client() { sockaddr_in client_address; - auto buffer = receive(1024, client_address); + auto buffer = TRY(receive(1024, client_address)); auto optional_request = Packet::from_raw_packet(buffer.data(), buffer.size()); if (!optional_request.has_value()) { dbgln("Got an invalid DNS packet"); diff --git a/Userland/Services/LookupServer/MulticastDNS.cpp b/Userland/Services/LookupServer/MulticastDNS.cpp index b6cfbabe9f..f806c6a6c4 100644 --- a/Userland/Services/LookupServer/MulticastDNS.cpp +++ b/Userland/Services/LookupServer/MulticastDNS.cpp @@ -51,7 +51,8 @@ MulticastDNS::MulticastDNS(Object* parent) void MulticastDNS::handle_packet() { - auto buffer = receive(1024); + // TODO: propagate the error somehow + auto buffer = MUST(receive(1024)); auto optional_packet = Packet::from_raw_packet(buffer.data(), buffer.size()); if (!optional_packet.has_value()) { dbgln("Got an invalid mDNS packet"); @@ -167,7 +168,8 @@ Vector MulticastDNS::lookup(Name const& name, RecordType record_type) return {}; } - auto buffer = receive(1024); + // TODO: propagate the error somehow + auto buffer = MUST(receive(1024)); if (buffer.is_empty()) return {}; auto optional_packet = Packet::from_raw_packet(buffer.data(), buffer.size());