Index: base/process/launch_win.cc |
diff --git a/base/process/launch_win.cc b/base/process/launch_win.cc |
index fa59f1ae90744469e397d3bd778cb8b1e98150c4..c17eba50f5f428b7439eb0144a8150cc56ff3cb6 100644 |
--- a/base/process/launch_win.cc |
+++ b/base/process/launch_win.cc |
@@ -64,8 +64,22 @@ void RouteStdioToConsole() { |
// stdout/stderr on startup (before the handle IDs can be reused). |
// _fileno(stdout) will return -2 (_NO_CONSOLE_FILENO) if stdout was |
// invalid. |
- if (_fileno(stdout) >= 0 || _fileno(stderr) >= 0) |
- return; |
+ if (_fileno(stdout) >= 0 || _fileno(stderr) >= 0) { |
+ // _fileno was broken for SUBSYSTEM:WINDOWS from VS2010 to VS2012/2013. |
+ // http://crbug.com/358267. Confirm that the underlying HANDLE is valid |
+ // before aborting. |
+ |
+ // This causes NaCl tests to hang on XP for reasons unclear, perhaps due |
+ // to not being able to inherit handles. Since it's only for debugging, |
+ // and redirecting still works, punt for now. |
+ if (base::win::GetVersion() < base::win::VERSION_VISTA) |
+ return; |
+ |
+ intptr_t stdout_handle = _get_osfhandle(_fileno(stdout)); |
+ intptr_t stderr_handle = _get_osfhandle(_fileno(stderr)); |
+ if (stdout_handle >= 0 || stderr_handle >= 0) |
+ return; |
+ } |
if (!AttachConsole(ATTACH_PARENT_PROCESS)) { |
unsigned int result = GetLastError(); |