summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2017-06-17 21:57:09 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2017-06-17 21:57:12 +0000
commit656a433a1b59d077f2e17b04b78ec50156e8a7d6 (patch)
tree1225625bedf0a0586f4cf15466f8094b7e68869f
parent7543ad20489bc33d3af5f4c4a94105c72927bd2d (diff)
parent9f9eaa4dfe984266bfa5e240b6b32d4dd8a41853 (diff)
downloadadb-656a433a1b59d077f2e17b04b78ec50156e8a7d6.tar.gz
Merge "adb: increase the shell command length limit."
-rw-r--r--adb_client.cpp2
-rw-r--r--adb_io.cpp2
-rw-r--r--commandline.cpp7
-rw-r--r--sockets.cpp2
-rw-r--r--test_device.py7
5 files changed, 17 insertions, 3 deletions
diff --git a/adb_client.cpp b/adb_client.cpp
index f5d0f02..e533a00 100644
--- a/adb_client.cpp
+++ b/adb_client.cpp
@@ -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;
diff --git a/adb_io.cpp b/adb_io.cpp
index ca8729e..38e3116 100644
--- a/adb_io.cpp
+++ b/adb_io.cpp
@@ -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;
}
diff --git a/commandline.cpp b/commandline.cpp
index 68ae4af..c9f1ee9 100644
--- a/commandline.cpp
+++ b/commandline.cpp
@@ -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.
diff --git a/sockets.cpp b/sockets.cpp
index 14ad1ff..e0143c6 100644
--- a/sockets.cpp
+++ b/sockets.cpp
@@ -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;
}
diff --git a/test_device.py b/test_device.py
index 737d0c2..9e1a2ec 100644
--- a/test_device.py
+++ b/test_device.py
@@ -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)