Merge "fastboot: fix TCP protocol version check."

This commit is contained in:
David Pursell 2016-02-17 18:16:12 +00:00 committed by Gerrit Code Review
commit bcaeb78f63
2 changed files with 18 additions and 5 deletions

View file

@ -28,6 +28,7 @@
#include "tcp.h" #include "tcp.h"
#include <android-base/parseint.h>
#include <android-base/stringprintf.h> #include <android-base/stringprintf.h>
namespace tcp { namespace tcp {
@ -98,7 +99,8 @@ bool TcpTransport::InitializeProtocol(std::string* error) {
return false; return false;
} }
char buffer[kHandshakeLength]; char buffer[kHandshakeLength + 1];
buffer[kHandshakeLength] = '\0';
if (socket_->ReceiveAll(buffer, kHandshakeLength, kHandshakeTimeoutMs) != kHandshakeLength) { if (socket_->ReceiveAll(buffer, kHandshakeLength, kHandshakeTimeoutMs) != kHandshakeLength) {
*error = android::base::StringPrintf( *error = android::base::StringPrintf(
"No initialization message received (%s). Target may not support TCP fastboot", "No initialization message received (%s). Target may not support TCP fastboot",
@ -111,9 +113,10 @@ bool TcpTransport::InitializeProtocol(std::string* error) {
return false; return false;
} }
if (memcmp(buffer + 2, "01", 2) != 0) { int version = 0;
if (!android::base::ParseInt(buffer + 2, &version) || version < kProtocolVersion) {
*error = android::base::StringPrintf("Unknown TCP protocol version %s (host version %02d)", *error = android::base::StringPrintf("Unknown TCP protocol version %s (host version %02d)",
std::string(buffer + 2, 2).c_str(), kProtocolVersion); buffer + 2, kProtocolVersion);
return false; return false;
} }

View file

@ -42,6 +42,16 @@ TEST(TcpConnectTest, TestSuccess) {
EXPECT_EQ("", error); EXPECT_EQ("", error);
} }
TEST(TcpConnectTest, TestNewerVersionSuccess) {
std::unique_ptr<SocketMock> mock(new SocketMock);
mock->ExpectSend("FB01");
mock->AddReceive("FB99");
std::string error;
EXPECT_NE(nullptr, tcp::internal::Connect(std::move(mock), &error));
EXPECT_EQ("", error);
}
TEST(TcpConnectTest, TestSendFailure) { TEST(TcpConnectTest, TestSendFailure) {
std::unique_ptr<SocketMock> mock(new SocketMock); std::unique_ptr<SocketMock> mock(new SocketMock);
mock->ExpectSendFailure("FB01"); mock->ExpectSendFailure("FB01");
@ -74,11 +84,11 @@ TEST(TcpConnectTest, TestBadResponseFailure) {
TEST(TcpConnectTest, TestUnknownVersionFailure) { TEST(TcpConnectTest, TestUnknownVersionFailure) {
std::unique_ptr<SocketMock> mock(new SocketMock); std::unique_ptr<SocketMock> mock(new SocketMock);
mock->ExpectSend("FB01"); mock->ExpectSend("FB01");
mock->AddReceive("FB02"); mock->AddReceive("FB00");
std::string error; std::string error;
EXPECT_EQ(nullptr, tcp::internal::Connect(std::move(mock), &error)); EXPECT_EQ(nullptr, tcp::internal::Connect(std::move(mock), &error));
EXPECT_EQ("Unknown TCP protocol version 02 (host version 01)", error); EXPECT_EQ("Unknown TCP protocol version 00 (host version 01)", error);
} }
// Fixture to configure a SocketMock for a successful TCP connection. // Fixture to configure a SocketMock for a successful TCP connection.