Index: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp =================================================================== --- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp +++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp @@ -914,7 +914,8 @@ if (GetSendAcks()) { const char *packet_checksum_cstr = &m_bytes[checksum_idx]; char packet_checksum = strtol(packet_checksum_cstr, NULL, 16); - char actual_checksum = CalculcateChecksum(packet_str); + char actual_checksum = CalculcateChecksum( + llvm::StringRef(m_bytes).slice(content_start, content_end)); success = packet_checksum == actual_checksum; if (!success) { if (log) Index: lldb/trunk/unittests/Process/gdb-remote/CMakeLists.txt =================================================================== --- lldb/trunk/unittests/Process/gdb-remote/CMakeLists.txt +++ lldb/trunk/unittests/Process/gdb-remote/CMakeLists.txt @@ -1,6 +1,7 @@ add_lldb_unittest(ProcessGdbRemoteTests GDBRemoteClientBaseTest.cpp GDBRemoteCommunicationClientTest.cpp + GDBRemoteCommunicationTest.cpp GDBRemoteTestUtils.cpp LINK_LIBS Index: lldb/trunk/unittests/Process/gdb-remote/GDBRemoteCommunicationTest.cpp =================================================================== --- lldb/trunk/unittests/Process/gdb-remote/GDBRemoteCommunicationTest.cpp +++ lldb/trunk/unittests/Process/gdb-remote/GDBRemoteCommunicationTest.cpp @@ -0,0 +1,67 @@ +//===-- GDBRemoteCommunicationTest.cpp --------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#include "GDBRemoteTestUtils.h" +#include "llvm/Testing/Support/Error.h" + +using namespace lldb_private::process_gdb_remote; +using namespace lldb_private; +using namespace lldb; +typedef GDBRemoteCommunication::PacketResult PacketResult; + +namespace { + +class TestClient : public GDBRemoteCommunication { +public: + TestClient() + : GDBRemoteCommunication("test.client", "test.client.listener") {} + + PacketResult ReadPacket(StringExtractorGDBRemote &response) { + return GDBRemoteCommunication::ReadPacket(response, std::chrono::seconds(1), + /*sync_on_timeout*/ false); + } +}; + +class GDBRemoteCommunicationTest : public GDBRemoteTest { +public: + void SetUp() override { + ASSERT_THAT_ERROR(Connect(client, server), llvm::Succeeded()); + } + +protected: + TestClient client; + MockServer server; + + bool Write(llvm::StringRef packet) { + ConnectionStatus status; + return server.Write(packet.data(), packet.size(), status, nullptr) == + packet.size(); + } +}; +} // end anonymous namespace + +TEST_F(GDBRemoteCommunicationTest, ReadPacket_checksum) { + struct TestCase { + llvm::StringLiteral Packet; + llvm::StringLiteral Payload; + }; + static constexpr TestCase Tests[] = { + {{"$#00"}, {""}}, + {{"$foobar#79"}, {"foobar"}}, + {{"$}}#fa"}, {"]"}}, + {{"$x*%#c7"}, {"xxxxxxxxx"}}, + }; + for (const auto &Test : Tests) { + SCOPED_TRACE(Test.Packet + " -> " + Test.Payload); + StringExtractorGDBRemote response; + ASSERT_TRUE(Write(Test.Packet)); + ASSERT_EQ(PacketResult::Success, client.ReadPacket(response)); + ASSERT_EQ(Test.Payload, response.GetStringRef()); + ASSERT_EQ(PacketResult::Success, server.GetAck()); + } +} Index: lldb/trunk/unittests/tools/lldb-server/tests/TestClient.cpp =================================================================== --- lldb/trunk/unittests/tools/lldb-server/tests/TestClient.cpp +++ lldb/trunk/unittests/tools/lldb-server/tests/TestClient.cpp @@ -37,12 +37,7 @@ if (!IsConnected()) return; - std::string response; - // Debugserver (non-conformingly?) sends a reply to the k packet instead of - // simply closing the connection. - PacketResult result = - IsDebugServer() ? PacketResult::Success : PacketResult::ErrorDisconnected; - EXPECT_THAT_ERROR(SendMessage("k", response, result), Succeeded()); + EXPECT_THAT_ERROR(SendMessage("k"), Succeeded()); } Expected> TestClient::launch(StringRef Log) {