summaryrefslogtreecommitdiff
path: root/services.cpp
diff options
context:
space:
mode:
authorAlan Jeon <skyisle@gmail.com>2014-10-16 17:05:25 +0900
committerElliott Hughes <enh@google.com>2015-05-11 16:28:04 -0700
commit012512d7e969ac5d5c2963502587b6bd51002011 (patch)
tree90d1be2f53b6d5a2e38305ba9dbd0c23abfd30af /services.cpp
parent10b52a68539de8cdce148959ce625ab202ae4ad5 (diff)
downloadadb-012512d7e969ac5d5c2963502587b6bd51002011.tar.gz
adb: Do not share memory between multiple thread
When multiple client try to connect to other hosts, it failed because memory corruption. Allocate memory for each thread like other command did. Change-Id: I79959ce3dbfd11c7553736cd3f5a899815873584 Signed-off-by: Alan Jeon <skyisle@gmail.com>
Diffstat (limited to 'services.cpp')
-rw-r--r--services.cpp14
1 files changed, 8 insertions, 6 deletions
diff --git a/services.cpp b/services.cpp
index e53a28c..b869479 100644
--- a/services.cpp
+++ b/services.cpp
@@ -618,16 +618,15 @@ void connect_emulator(const std::string& port_spec, std::string* response) {
}
}
-static void connect_service(int fd, void* cookie)
-{
- char *host = reinterpret_cast<char*>(cookie);
-
+static void connect_service(int fd, void* data) {
+ char* host = reinterpret_cast<char*>(data);
std::string response;
if (!strncmp(host, "emu:", 4)) {
connect_emulator(host + 4, &response);
} else {
connect_device(host, &response);
}
+ free(host);
// Send response for emulator and device
SendProtocolString(fd, response);
@@ -664,6 +663,9 @@ asocket* host_service_to_socket(const char* name, const char *serial)
sinfo->transport_type = kTransportAny;
sinfo->state = CS_DEVICE;
} else {
+ if (sinfo->serial) {
+ free(sinfo->serial);
+ }
free(sinfo);
return NULL;
}
@@ -671,8 +673,8 @@ asocket* host_service_to_socket(const char* name, const char *serial)
int fd = create_service_thread(wait_for_state, sinfo);
return create_local_socket(fd);
} else if (!strncmp(name, "connect:", 8)) {
- const char *host = name + 8;
- int fd = create_service_thread(connect_service, (void *)host);
+ char* host = strdup(name + 8);
+ int fd = create_service_thread(connect_service, host);
return create_local_socket(fd);
}
return NULL;