Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5bf8a420 authored by David Turner's avatar David Turner Committed by Android Git Automerger
Browse files

am 3dbcb6d6: am 98d07897: Merge "Windows adb: Make client stdout and stderr handles uninheritable"

* commit '3dbcb6d6':
  Windows adb: Make client stdout and stderr handles uninheritable
parents 51e06618 3dbcb6d6
Loading
Loading
Loading
Loading
+21 −0
Original line number Original line Diff line number Diff line
@@ -1018,6 +1018,7 @@ int launch_server(int server_port)
    /* message since the pipe handles must be inheritable, we use a     */
    /* message since the pipe handles must be inheritable, we use a     */
    /* security attribute                                               */
    /* security attribute                                               */
    HANDLE                pipe_read, pipe_write;
    HANDLE                pipe_read, pipe_write;
    HANDLE                stdout_handle, stderr_handle;
    SECURITY_ATTRIBUTES   sa;
    SECURITY_ATTRIBUTES   sa;
    STARTUPINFO           startup;
    STARTUPINFO           startup;
    PROCESS_INFORMATION   pinfo;
    PROCESS_INFORMATION   pinfo;
@@ -1037,6 +1038,26 @@ int launch_server(int server_port)


    SetHandleInformation( pipe_read, HANDLE_FLAG_INHERIT, 0 );
    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) );
    ZeroMemory( &startup, sizeof(startup) );
    startup.cb = sizeof(startup);
    startup.cb = sizeof(startup);
    startup.hStdInput  = GetStdHandle( STD_INPUT_HANDLE );
    startup.hStdInput  = GetStdHandle( STD_INPUT_HANDLE );