From 40708a0caaa1e808e0d7287b641b7252aeaa0c7d Mon Sep 17 00:00:00 2001 From: "scottmg@chromium.org" Date: Thu, 3 Apr 2014 01:34:36 +0000 Subject: Fix --enable-logging after VS2013 switch After https://src.chromium.org/viewvc/chrome?view=rev&revision=178656 a valid fileno of stdout or stderr abort connection of the console to stdio on Windows. Looking at the VS CRT between 2010 and 2013, it seems the behavior that r178656 was relying on changed: (in __initstdio) C:\Program Files (x86)>diff "Microsoft Visual Studio 10.0\vc\crt\src\_file.c" "Microsoft Visual Studio 12.0\vc\crt\src\_file.c" 144,157d143 < for ( i = 0 ; i < 3 ; i++ ) { < if ( (_osfhnd(i) == (intptr_t)INVALID_HANDLE_VALUE) || < (_osfhnd(i) == _NO_CONSOLE_FILENO) || < (_osfhnd(i) == 0) ) < { < /* < * For stdin, stdout & stderr, we use _NO_CONSOLE_FILENO (a value < * different from _INVALID_HANDLE_VALUE to distinguish between < * a failure in opening a file & a program run without a console. < */ < _iob[i]._file = _NO_CONSOLE_FILENO; < } < } < 194a181 > __piob = NULL; There's an open bug http://connect.microsoft.com/VisualStudio/feedback/details/785119/ but as it was broken in 2012 and not fixed in 2013, it doesn't look like it's going to be fixed. (The documentation still suggests that r178656 is correct: http://msdn.microsoft.com/en-us/library/zs6wbdhx(v=vs.100).aspx vs http://msdn.microsoft.com/en-us/library/zs6wbdhx(v=vs.120).aspx ) but that's little consolation. So, confirm that the underlying HANDLE is valid before aborting. TBR=brettw@chromium.org R=mseaborn@chromium.org BUG=169941, 309197, 358267 Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=260738 Review URL: https://codereview.chromium.org/219813003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@261253 0039d316-1c4b-4281-b951-d872f2087c98 --- base/process/launch_win.cc | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'base/process') diff --git a/base/process/launch_win.cc b/base/process/launch_win.cc index de05255..edb523b 100644 --- a/base/process/launch_win.cc +++ b/base/process/launch_win.cc @@ -63,8 +63,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(); -- cgit v1.1