LibGUI: Fix packet sending and cleanup receiving

This commit is contained in:
2026-04-15 21:52:51 +03:00
parent ce318c7930
commit 984c7c0a89

View File

@@ -96,12 +96,12 @@ namespace LibGUI
return on_socket_error(function); return on_socket_error(function);
} }
packet.serialize(m_in_buffer.span()); packet.serialize(m_out_buffer.span());
size_t total_sent = 0; size_t total_sent = 0;
while (total_sent < serialized_size) while (total_sent < serialized_size)
{ {
const ssize_t nsend = send(m_server_fd, m_in_buffer.data() + total_sent, serialized_size - total_sent, 0); const ssize_t nsend = send(m_server_fd, m_out_buffer.data() + total_sent, serialized_size - total_sent, 0);
if (nsend < 0) if (nsend < 0)
dwarnln("send: {}", strerror(errno)); dwarnln("send: {}", strerror(errno));
if (nsend <= 0) if (nsend <= 0)
@@ -327,15 +327,14 @@ namespace LibGUI
m_in_buffer_size += nrecv; m_in_buffer_size += nrecv;
} }
size_t bytes_handled = 0; BAN::ConstByteSpan in_span = m_in_buffer.span().slice(0, m_in_buffer_size);
while (m_in_buffer_size - bytes_handled >= sizeof(PacketHeader)) while (in_span.size() >= sizeof(PacketHeader))
{ {
BAN::ConstByteSpan packet_span = m_in_buffer.span().slice(bytes_handled); const auto header = in_span.as<const PacketHeader>();
const auto header = packet_span.as<const PacketHeader>(); if (in_span.size() < header.size || header.size < sizeof(LibGUI::PacketHeader))
if (packet_span.size() < header.size || header.size < sizeof(LibGUI::PacketHeader))
break; break;
packet_span = packet_span.slice(0, header.size);
const auto packet_span = in_span.slice(0, header.size);
switch (header.type) switch (header.type)
{ {
#define TRY_OR_BREAK(...) ({ auto&& e = (__VA_ARGS__); if (e.is_error()) break; e.release_value(); }) #define TRY_OR_BREAK(...) ({ auto&& e = (__VA_ARGS__); if (e.is_error()) break; e.release_value(); })
@@ -402,16 +401,16 @@ namespace LibGUI
break; break;
} }
bytes_handled += header.size; in_span = in_span.slice(header.size);
} }
// NOTE: this will only move a single partial packet, so this is fine // NOTE: this will only move a single partial packet, so this is fine
m_in_buffer_size -= bytes_handled;
memmove( memmove(
m_in_buffer.data(), m_in_buffer.data(),
m_in_buffer.data() + bytes_handled, in_span.data(),
m_in_buffer_size in_span.size()
); );
m_in_buffer_size = in_span.size();
if (m_in_buffer_size >= sizeof(LibGUI::PacketHeader)) if (m_in_buffer_size >= sizeof(LibGUI::PacketHeader))
{ {