diff options
author | David Turner <digit@android.com> | 2013-01-21 10:16:53 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2013-01-21 10:16:54 +0000 |
commit | 98d0789772b94b9b0c2aecfab74dc1a9283a91b1 (patch) | |
tree | e5bdbcf30eb042204253fee9ed61c86264411a78 /adb/adb.c | |
parent | 026b3953d4471cd43c850ee72bbca7cc77e87a34 (diff) | |
parent | 267aa8b00eadf273321e492026af74b7baad890e (diff) | |
download | system_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.c | 21 |
1 files changed, 21 insertions, 0 deletions
@@ -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 ); |