Merge "adb: increase the shell command length limit." am: 9d2e688b9a

am: 749d2a0ab5

Change-Id: Ib450863883d11cb256421e2c4f12c36d8af37570
This commit is contained in:
Josh Gao 2017-06-17 22:06:30 +00:00 committed by android-build-merger
commit 3df484eeab
5 changed files with 17 additions and 3 deletions

View file

@ -125,7 +125,7 @@ bool adb_status(int fd, std::string* error) {
static int _adb_connect(const std::string& service, std::string* error) {
D("_adb_connect: %s", service.c_str());
if (service.empty() || service.size() > MAX_PAYLOAD_V1) {
if (service.empty() || service.size() > MAX_PAYLOAD) {
*error = android::base::StringPrintf("bad service name length (%zd)",
service.size());
return -1;

View file

@ -31,7 +31,7 @@
bool SendProtocolString(int fd, const std::string& s) {
unsigned int length = s.size();
if (length > MAX_PAYLOAD_V1 - 4) {
if (length > MAX_PAYLOAD - 4) {
errno = EMSGSIZE;
return false;
}

View file

@ -599,6 +599,13 @@ static int RemoteShell(bool use_shell_protocol, const std::string& type_arg,
std::string service_string = ShellServiceString(use_shell_protocol,
type_arg, command);
// Old devices can't handle a service string that's longer than MAX_PAYLOAD_V1.
// Use |use_shell_protocol| to determine whether to allow a command longer than that.
if (service_string.size() > MAX_PAYLOAD_V1 && !use_shell_protocol) {
fprintf(stderr, "error: shell command too long\n");
return 1;
}
// Make local stdin raw if the device allocates a PTY, which happens if:
// 1. We are explicitly asking for a PTY shell, or
// 2. We don't specify shell type and are starting an interactive session.

View file

@ -686,7 +686,7 @@ static int smart_socket_enqueue(asocket* s, apacket* p) {
}
len = unhex(p->data, 4);
if ((len < 1) || (len > MAX_PAYLOAD_V1)) {
if ((len < 1) || (len > MAX_PAYLOAD)) {
D("SS(%d): bad size (%d)", s->id, len);
goto fail;
}

View file

@ -342,6 +342,13 @@ class ShellTest(DeviceTest):
out = self.device.shell(['echo', 'foo'])[0]
self.assertEqual(out, 'foo' + self.device.linesep)
def test_shell_command_length(self):
# Devices that have shell_v2 should be able to handle long commands.
if self.device.has_shell_protocol():
rc, out, err = self.device.shell_nocheck(['echo', 'x' * 16384])
self.assertEqual(rc, 0)
self.assertTrue(out == ('x' * 16384 + '\n'))
def test_shell_nocheck_failure(self):
rc, out, _ = self.device.shell_nocheck(['false'])
self.assertNotEqual(rc, 0)