Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 34abac7d authored by Josh Gao's avatar Josh Gao Committed by Steven Moreland
Browse files

adb: increase the shell command length limit.

Relax the shell command length limits when talking to an adbd with the
shell protocol.

shell is pretty much the only service that takes an arbitrarily long
string, so this is somewhat safe.

Bug: http://b/37716055
Test: `adb shell $(python -c 'print "echo " + "f" * (32*1024)') | wc` on L and master

Merged-In: I0737fd2244530ef8080f300cd3a3549a1ab93465
Change-Id: I0737fd2244530ef8080f300cd3a3549a1ab93465
parent fe11ca54
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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;
    }
+7 −0
Original line number Diff line number Diff line
@@ -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.
+1 −1
Original line number Diff line number Diff line
@@ -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;
    }
+7 −0
Original line number Diff line number Diff line
@@ -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)