diff options
author | scottmg@chromium.org <scottmg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-03 01:34:36 +0000 |
---|---|---|
committer | scottmg@chromium.org <scottmg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-03 01:34:36 +0000 |
commit | 40708a0caaa1e808e0d7287b641b7252aeaa0c7d (patch) | |
tree | 320b6ac1bfe76ff58196e55103c9907fa4804e76 /base/process | |
parent | 516adaa6d4088f2f3deea2a921bb3222415a5863 (diff) | |
download | chromium_src-40708a0caaa1e808e0d7287b641b7252aeaa0c7d.zip chromium_src-40708a0caaa1e808e0d7287b641b7252aeaa0c7d.tar.gz chromium_src-40708a0caaa1e808e0d7287b641b7252aeaa0c7d.tar.bz2 |
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
Diffstat (limited to 'base/process')
-rw-r--r-- | base/process/launch_win.cc | 18 |
1 files changed, 16 insertions, 2 deletions
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(); |