Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Unified Diff: client/crashpad_client_win.cc

Issue 1473793002: win: Don't try to inherit console handles in StartHandler() (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: fixes Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: client/crashpad_client_win.cc
diff --git a/client/crashpad_client_win.cc b/client/crashpad_client_win.cc
index 40a856f33f03ba03cbeb2c57c0e6ae59a30b91f0..c7cb09a91531e0fe691b6230d10cce7833121820 100644
--- a/client/crashpad_client_win.cc
+++ b/client/crashpad_client_win.cc
@@ -132,6 +132,18 @@ using ScopedProcThreadAttributeList =
base::ScopedGeneric<PPROC_THREAD_ATTRIBUTE_LIST,
ScopedProcThreadAttributeListTraits>;
+bool IsInheritableHandle(HANDLE handle) {
+ if (!handle || handle == INVALID_HANDLE_VALUE)
+ return false;
+
+ // File handles (FILE_TYPE_DISK) and pipe handles (FILE_TYPE_PIPE) are known
+ // to be inheritable. Console handles (FILE_TYPE_CHAR) are not inheritable via
+ // PROC_THREAD_ATTRIBUTE_HANDLE_LIST. See
+ // https://crashpad.chromium.org/bug/77.
+ DWORD handle_type = GetFileType(handle);
+ return handle_type == FILE_TYPE_DISK || handle_type == FILE_TYPE_PIPE;
+}
+
// Adds |handle| to |handle_list| if it appears valid, and is not already in
// |handle_list|.
//
@@ -142,11 +154,12 @@ using ScopedProcThreadAttributeList =
// silently not inherit any handles.
//
// Use this function to add handles with uncertain validities.
-void AddHandleToListIfValid(std::vector<HANDLE>* handle_list, HANDLE handle) {
+void AddHandleToListIfValidAndInheritable(std::vector<HANDLE>* handle_list,
+ HANDLE handle) {
// There doesn't seem to be any documentation of this, but if there's a handle
// duplicated in this list, CreateProcess() fails with
// ERROR_INVALID_PARAMETER.
- if (handle && handle != INVALID_HANDLE_VALUE &&
+ if (IsInheritableHandle(handle) &&
std::find(handle_list->begin(), handle_list->end(), handle) ==
handle_list->end()) {
handle_list->push_back(handle);
@@ -267,9 +280,12 @@ bool CrashpadClient::StartHandler(
handle_list.reserve(4);
handle_list.push_back(pipe_write);
- AddHandleToListIfValid(&handle_list, startup_info.StartupInfo.hStdInput);
- AddHandleToListIfValid(&handle_list, startup_info.StartupInfo.hStdOutput);
- AddHandleToListIfValid(&handle_list, startup_info.StartupInfo.hStdError);
+ AddHandleToListIfValidAndInheritable(&handle_list,
+ startup_info.StartupInfo.hStdInput);
+ AddHandleToListIfValidAndInheritable(&handle_list,
+ startup_info.StartupInfo.hStdOutput);
+ AddHandleToListIfValidAndInheritable(&handle_list,
+ startup_info.StartupInfo.hStdError);
rv = update_proc_thread_attribute(
startup_info.lpAttributeList,
0,
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698