Skip to content

Commit 95d6d43

Browse files
committed
[Backtracing] Fix color=tty to check the actual output.
The `color=tty` setting was checking `stdout` to see if it was a TTY, but we may be using `stderr`, in which case it's easy to end up with coloured output in a file we're redirecting to. Fix it to check the selected output instead. rdar://164624364
1 parent fa55b25 commit 95d6d43

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

stdlib/public/runtime/Backtrace.cpp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,16 @@ char swiftBacktraceOutputPath[SWIFT_BACKTRACE_OUTPUT_PATH_SIZE] __attribute__((s
221221

222222
void _swift_backtraceSetupEnvironment();
223223

224+
bool isStderrATty()
225+
{
226+
#ifndef _WIN32
227+
return isatty(STDERR_FILENO);
228+
#else
229+
DWORD dwMode;
230+
return GetConsoleMode(GetStdHandle(STD_ERROR_HANDLE), &dwMode);
231+
#endif
232+
}
233+
224234
bool isStdoutATty()
225235
{
226236
#ifndef _WIN32
@@ -412,10 +422,6 @@ BacktraceInitializer::BacktraceInitializer() {
412422
(isStdoutATty() && isStdinATty()) ? OnOffTty::On : OnOffTty::Off;
413423
}
414424

415-
if (_swift_backtraceSettings.color == OnOffTty::TTY)
416-
_swift_backtraceSettings.color =
417-
isStdoutATty() ? OnOffTty::On : OnOffTty::Off;
418-
419425
if (_swift_backtraceSettings.preset == Preset::Auto) {
420426
if (_swift_backtraceSettings.interactive == OnOffTty::On)
421427
_swift_backtraceSettings.preset = Preset::Friendly;
@@ -454,6 +460,16 @@ BacktraceInitializer::BacktraceInitializer() {
454460
_swift_backtraceSettings.outputTo = OutputTo::Stderr;
455461
}
456462

463+
if (_swift_backtraceSettings.color == OnOffTty::TTY) {
464+
bool outputToIsTty;
465+
if (_swift_backtraceSettings.outputTo == OutputTo::Stderr)
466+
outputToIsTty = isStderrATty();
467+
else
468+
outputToIsTty = isStdoutATty();
469+
_swift_backtraceSettings.color =
470+
outputToIsTty ? OnOffTty::On : OnOffTty::Off;
471+
}
472+
457473
if (_swift_backtraceSettings.enabled == OnOffTty::On) {
458474
// Copy the path to swift-backtrace into swiftBacktracePath, then write
459475
// protect it so that it can't be overwritten easily at runtime. We do

0 commit comments

Comments
 (0)