summaryrefslogtreecommitdiffstats
path: root/adb
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2014-06-10 16:22:17 -0700
committerElliott Hughes <enh@google.com>2014-08-05 22:55:39 +0000
commit0cc642c82d94affd5804b7c28c2f2578b8fadafb (patch)
tree58dd368341eca38abba95df77d0efb46be00d9f2 /adb
parentdcd2f0ef2f87a3fcade74aec7e178be14d0ea335 (diff)
downloadsystem_core-0cc642c82d94affd5804b7c28c2f2578b8fadafb.zip
system_core-0cc642c82d94affd5804b7c28c2f2578b8fadafb.tar.gz
system_core-0cc642c82d94affd5804b7c28c2f2578b8fadafb.tar.bz2
Partially revert argument escaping.
Commands chained with && need to be passed through literally instead of always being quoted. (cherry-pick of 7c460351f53cb683097fe4071b9ec1e4cd7cdf82.) Bug: 15479704 Change-Id: I2998e40a92a3bfd092098cd526403b469c86c9a6
Diffstat (limited to 'adb')
-rw-r--r--adb/commandline.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/adb/commandline.c b/adb/commandline.c
index 8189a71..ccf158c 100644
--- a/adb/commandline.c
+++ b/adb/commandline.c
@@ -545,32 +545,39 @@ static void status_window(transport_type ttype, const char* serial)
}
/** Duplicate and escape given argument. */
-static char *escape_argv(const char *s)
+static char *escape_arg(const char *s)
{
const char *ts;
size_t alloc_len;
char *ret;
char *dest;
- alloc_len = 2;
+ alloc_len = 0;
for (ts = s; *ts != '\0'; ts++) {
alloc_len++;
- if (*ts == '"' || *ts == '\\') {
+ if (*ts == ' ' || *ts == '"' || *ts == '\\' || *ts == '(' || *ts == ')') {
alloc_len++;
}
}
+ if (alloc_len == 0) {
+ // Preserve empty arguments
+ ret = (char *) malloc(3);
+ ret[0] = '\"';
+ ret[1] = '\"';
+ ret[2] = '\0';
+ return ret;
+ }
+
ret = (char *) malloc(alloc_len + 1);
dest = ret;
- *dest++ = '"';
for (ts = s; *ts != '\0'; ts++) {
- if (*ts == '"' || *ts == '\\') {
+ if (*ts == ' ' || *ts == '"' || *ts == '\\' || *ts == '(' || *ts == ')') {
*dest++ = '\\';
}
*dest++ = *ts;
}
- *dest++ = '"';
*dest++ = '\0';
return ret;
@@ -680,9 +687,9 @@ static int logcat(transport_type transport, char* serial, int argc, char **argv)
char *quoted;
log_tags = getenv("ANDROID_LOG_TAGS");
- quoted = escape_argv(log_tags == NULL ? "" : log_tags);
+ quoted = escape_arg(log_tags == NULL ? "" : log_tags);
snprintf(buf, sizeof(buf),
- "shell:export ANDROID_LOG_TAGS=%s ; exec logcat", quoted);
+ "shell:export ANDROID_LOG_TAGS=\"%s\"; exec logcat", quoted);
free(quoted);
if (!strcmp(argv[0], "longcat")) {
@@ -692,7 +699,7 @@ static int logcat(transport_type transport, char* serial, int argc, char **argv)
argc -= 1;
argv += 1;
while(argc-- > 0) {
- quoted = escape_argv(*argv++);
+ quoted = escape_arg(*argv++);
strncat(buf, " ", sizeof(buf) - 1);
strncat(buf, quoted, sizeof(buf) - 1);
free(quoted);
@@ -1206,7 +1213,7 @@ top:
argc -= 2;
argv += 2;
while (argc-- > 0) {
- char *quoted = escape_argv(*argv++);
+ char *quoted = escape_arg(*argv++);
strncat(buf, " ", sizeof(buf) - 1);
strncat(buf, quoted, sizeof(buf) - 1);
free(quoted);
@@ -1249,7 +1256,7 @@ top:
argc -= 2;
argv += 2;
while (argc-- > 0) {
- char *quoted = escape_argv(*argv++);
+ char *quoted = escape_arg(*argv++);
strncat(buf, " ", sizeof(buf) - 1);
strncat(buf, quoted, sizeof(buf) - 1);
free(quoted);
@@ -1674,7 +1681,7 @@ static int pm_command(transport_type transport, char* serial,
snprintf(buf, sizeof(buf), "shell:pm");
while(argc-- > 0) {
- char *quoted = escape_argv(*argv++);
+ char *quoted = escape_arg(*argv++);
strncat(buf, " ", sizeof(buf) - 1);
strncat(buf, quoted, sizeof(buf) - 1);
free(quoted);
@@ -1708,7 +1715,7 @@ static int delete_file(transport_type transport, char* serial, char* filename)
char* quoted;
snprintf(buf, sizeof(buf), "shell:rm ");
- quoted = escape_argv(filename);
+ quoted = escape_arg(filename);
strncat(buf, quoted, sizeof(buf)-1);
free(quoted);