summaryrefslogtreecommitdiffstats
path: root/adb/adb.c
diff options
context:
space:
mode:
authorDavid Turner <digit@android.com>2013-01-21 10:16:53 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2013-01-21 10:16:54 +0000
commit98d0789772b94b9b0c2aecfab74dc1a9283a91b1 (patch)
treee5bdbcf30eb042204253fee9ed61c86264411a78 /adb/adb.c
parent026b3953d4471cd43c850ee72bbca7cc77e87a34 (diff)
parent267aa8b00eadf273321e492026af74b7baad890e (diff)
downloadsystem_core-98d0789772b94b9b0c2aecfab74dc1a9283a91b1.zip
system_core-98d0789772b94b9b0c2aecfab74dc1a9283a91b1.tar.gz
system_core-98d0789772b94b9b0c2aecfab74dc1a9283a91b1.tar.bz2
Merge "Windows adb: Make client stdout and stderr handles uninheritable"
Diffstat (limited to 'adb/adb.c')
-rw-r--r--adb/adb.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/adb/adb.c b/adb/adb.c
index 4c3364f..b5d93f8 100644
--- a/adb/adb.c
+++ b/adb/adb.c
@@ -991,6 +991,7 @@ int launch_server(int server_port)
/* message since the pipe handles must be inheritable, we use a */
/* security attribute */
HANDLE pipe_read, pipe_write;
+ HANDLE stdout_handle, stderr_handle;
SECURITY_ATTRIBUTES sa;
STARTUPINFO startup;
PROCESS_INFORMATION pinfo;
@@ -1010,6 +1011,26 @@ int launch_server(int server_port)
SetHandleInformation( pipe_read, HANDLE_FLAG_INHERIT, 0 );
+ /* Some programs want to launch an adb command and collect its output by
+ * calling CreateProcess with inheritable stdout/stderr handles, then
+ * using read() to get its output. When this happens, the stdout/stderr
+ * handles passed to the adb client process will also be inheritable.
+ * When starting the adb server here, care must be taken to reset them
+ * to non-inheritable.
+ * Otherwise, something bad happens: even if the adb command completes,
+ * the calling process is stuck while read()-ing from the stdout/stderr
+ * descriptors, because they're connected to corresponding handles in the
+ * adb server process (even if the latter never uses/writes to them).
+ */
+ stdout_handle = GetStdHandle( STD_OUTPUT_HANDLE );
+ stderr_handle = GetStdHandle( STD_ERROR_HANDLE );
+ if (stdout_handle != INVALID_HANDLE_VALUE) {
+ SetHandleInformation( stdout_handle, HANDLE_FLAG_INHERIT, 0 );
+ }
+ if (stderr_handle != INVALID_HANDLE_VALUE) {
+ SetHandleInformation( stderr_handle, HANDLE_FLAG_INHERIT, 0 );
+ }
+
ZeroMemory( &startup, sizeof(startup) );
startup.cb = sizeof(startup);
startup.hStdInput = GetStdHandle( STD_INPUT_HANDLE );