Increase the maximum shell command length to 4096ish.

The actual maximum length will depend on the version of the shell
protocol being used, and any additional parameters being passed through
(e.g. TERM=xterm-256color). This should be able to be raised to 64K for
devices with commit 3d2904c (L-MR1 and above), but that'll require some
plumbing.

Bug: http://b/20467103
Change-Id: Idf0c46af5b18b854110aba58df13a53297d2475f
This commit is contained in:
Josh Gao 2016-01-15 14:35:54 -08:00
parent a590596dca
commit 7e6683ce40
4 changed files with 10 additions and 9 deletions

View File

@ -857,8 +857,7 @@ int handle_forward_request(const char* service, TransportType type, const char*
#if ADB_HOST
SendOkay(reply_fd);
#endif
SendProtocolString(reply_fd, listeners);
return 1;
return SendProtocolString(reply_fd, listeners);
}
if (!strcmp(service, "killforward-all")) {

View File

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

View File

@ -22,14 +22,16 @@
#include <android-base/stringprintf.h>
#include "adb.h"
#include "adb_trace.h"
#include "adb_utils.h"
#include "sysdeps.h"
bool SendProtocolString(int fd, const std::string& s) {
int length = s.size();
if (length > 0xffff) {
length = 0xffff;
unsigned int length = s.size();
if (length > MAX_PAYLOAD_V1 - 4) {
errno = EMSGSIZE;
return false;
}
// The cost of sending two strings outweighs the cost of formatting.

View File

@ -698,17 +698,17 @@ static int smart_socket_enqueue(asocket *s, apacket *p)
p = s->pkt_first;
}
/* don't bother if we can't decode the length */
/* don't bother if we can't decode the length */
if(p->len < 4) return 0;
len = unhex(p->data, 4);
if((len < 1) || (len > 1024)) {
if ((len < 1) || (len > MAX_PAYLOAD_V1)) {
D("SS(%d): bad size (%d)", s->id, len);
goto fail;
}
D("SS(%d): len is %d", s->id, len );
/* can't do anything until we have the full header */
/* can't do anything until we have the full header */
if((len + 4) > p->len) {
D("SS(%d): waiting for %d more bytes", s->id, len+4 - p->len);
return 0;