GDBServer: Queue complete protocol packets

Expose BufferedStreamSocket's allow-smaller policy through Write while
preserving the existing default for other callers. GDB replies now
require enough queue space for the complete RSP packet and close the
connection instead of silently discarding an unwritten suffix.
pull/3782/head
Stenzek 2 months ago
parent 8d7046a893
commit 60a4ec3639
No known key found for this signature in database

@ -672,8 +672,11 @@ void GDBServer::ClientSocket::SendPacket(std::string_view sv)
return;
DEBUG_LOG("Send reply: {}", sv);
if (size_t written = Write(sv.data(), sv.length()); written != sv.length())
if (size_t written = Write(sv.data(), sv.length(), false); written != sv.length())
{
ERROR_LOG("Only wrote {} of {} bytes.", written, sv.length());
Close();
}
}
void GDBServer::ClientSocket::OnSystemPaused(u8 signal)

@ -1072,13 +1072,13 @@ size_t BufferedStreamSocket::Read(void* buffer, size_t buffer_size)
return bytes_to_read;
}
size_t BufferedStreamSocket::Write(const void* buffer, size_t buffer_size)
size_t BufferedStreamSocket::Write(const void* buffer, size_t buffer_size, bool allow_smaller /* = true */)
{
if (!m_connected)
return 0;
// Read from receive buffer.
const std::span<u8> wrbuf = AcquireWriteBuffer(buffer_size, true);
const std::span<u8> wrbuf = AcquireWriteBuffer(buffer_size, allow_smaller);
if (wrbuf.empty())
return 0;

@ -277,7 +277,7 @@ public:
// Hide StreamSocket read/write methods.
size_t Read(void* buffer, size_t buffer_size);
size_t Write(const void* buffer, size_t buffer_size);
size_t Write(const void* buffer, size_t buffer_size, bool allow_smaller = true);
size_t WriteVector(const void** buffers, const size_t* buffer_lengths, size_t num_buffers);
virtual void Close() override;

Loading…
Cancel
Save