Terminal crashes when exiting a bash shell #18338

Open
opened 2026-01-31 06:10:51 +00:00 by claunia · 0 comments
Owner

Originally created by @j4james on GitHub (Aug 30, 2022).

Windows Terminal version

1.15.1862.0

Windows build number

10.0.19044.1889

Other Software

WSL with Ubuntu 20.04.4 LTS

Steps to reproduce

  1. Start Windows Terminal
  2. Open two tabs, one of which is a bash shell.
  3. Exit the bash shell (with exit).

Expected Behavior

The terminal should remain open after the bash shell exits, with the other tab still working.

Actual Behavior

The terminal crashes.

I was able to reproduce this in the debugger with a build derived from commit c12987af41, and the stack trace for the crash looked like this:

ntdll.dll!TppRaiseInvalidParameter()	Unknown
ntdll.dll!TppTimerpValidateTimer()	Unknown
ntdll.dll!TpSetTimerEx()	Unknown
Microsoft.Terminal.Control.dll!winrt::Microsoft::Terminal::Control::implementation::ControlCore::_terminalScrollPositionChanged(const int viewTop, const int viewHeight, const int bufferSize) Line 1308	C++
[External Code]	
Microsoft.Terminal.Control.dll!Microsoft::Terminal::Core::Terminal::_NotifyScrollEvent() Line 1305	C++
Microsoft.Terminal.Control.dll!Microsoft::Console::VirtualTerminal::AdaptDispatch::_EraseScrollback() Line 1952	C++
Microsoft.Terminal.Control.dll!Microsoft::Console::VirtualTerminal::AdaptDispatch::EraseInDisplay(const Microsoft::Console::VirtualTerminal::DispatchTypes::EraseType eraseType) Line 614	C++
Microsoft.Terminal.Control.dll!Microsoft::Console::VirtualTerminal::OutputStateMachineEngine::ActionCsiDispatch(const Microsoft::Console::VirtualTerminal::VTID id, const Microsoft::Console::VirtualTerminal::VTParameters parameters) Line 492	C++
Microsoft.Terminal.Control.dll!Microsoft::Console::VirtualTerminal::StateMachine::_SafeExecute<`Microsoft::Console::VirtualTerminal::StateMachine::_ActionCsiDispatch'::`2'::<lambda_1>>(Microsoft::Console::VirtualTerminal::StateMachine::_ActionCsiDispatch::__l2::<lambda_1> && lambda) Line 2039	C++
Microsoft.Terminal.Control.dll!Microsoft::Console::VirtualTerminal::StateMachine::_ActionCsiDispatch(const wchar_t wch) Line 480	C++
Microsoft.Terminal.Control.dll!Microsoft::Console::VirtualTerminal::StateMachine::ProcessCharacter(const wchar_t wch) Line 1778	C++
Microsoft.Terminal.Control.dll!Microsoft::Console::VirtualTerminal::StateMachine::ProcessString(const std::basic_string_view<wchar_t,std::char_traits<wchar_t>> string) Line 1853	C++
Microsoft.Terminal.Control.dll!winrt::Microsoft::Terminal::Control::implementation::ControlCore::_connectionOutputHandler(const winrt::hstring & hstr) Line 1706	C++
Microsoft.Terminal.Control.dll!winrt::impl::delegate<winrt::Microsoft::Terminal::TerminalConnection::TerminalOutputHandler,`winrt::Microsoft::Terminal::TerminalConnection::TerminalOutputHandler::implementation<winrt::Microsoft::Terminal::Control::implementation::ControlCore,void (__cdecl winrt::Microsoft::Terminal::Control::implementation::ControlCore::*)(winrt::hstring const &)>'::`1'::<lambda_218_>>::Invoke(void * output) Line 174	C++
[External Code]	

The problem, as far as I can make out, is that the ControlCore instance is deleted at this point in time. If you look at ControlCore::Close method, we're closing the connection asynchronously, which I think means we're still receiving VT sequences (in this case \e[3J) after ControlCore is gone. Assuming I've understood that correctly, that would probably explain the crash.

Originally created by @j4james on GitHub (Aug 30, 2022). ### Windows Terminal version 1.15.1862.0 ### Windows build number 10.0.19044.1889 ### Other Software WSL with Ubuntu 20.04.4 LTS ### Steps to reproduce 1. Start Windows Terminal 2. Open two tabs, one of which is a bash shell. 3. Exit the bash shell (with `exit`). ### Expected Behavior The terminal should remain open after the bash shell exits, with the other tab still working. ### Actual Behavior The terminal crashes. I was able to reproduce this in the debugger with a build derived from commit c12987af415c5e0911d7a0a81b8494fbe6307328, and the stack trace for the crash looked like this: ntdll.dll!TppRaiseInvalidParameter() Unknown ntdll.dll!TppTimerpValidateTimer() Unknown ntdll.dll!TpSetTimerEx() Unknown Microsoft.Terminal.Control.dll!winrt::Microsoft::Terminal::Control::implementation::ControlCore::_terminalScrollPositionChanged(const int viewTop, const int viewHeight, const int bufferSize) Line 1308 C++ [External Code] Microsoft.Terminal.Control.dll!Microsoft::Terminal::Core::Terminal::_NotifyScrollEvent() Line 1305 C++ Microsoft.Terminal.Control.dll!Microsoft::Console::VirtualTerminal::AdaptDispatch::_EraseScrollback() Line 1952 C++ Microsoft.Terminal.Control.dll!Microsoft::Console::VirtualTerminal::AdaptDispatch::EraseInDisplay(const Microsoft::Console::VirtualTerminal::DispatchTypes::EraseType eraseType) Line 614 C++ Microsoft.Terminal.Control.dll!Microsoft::Console::VirtualTerminal::OutputStateMachineEngine::ActionCsiDispatch(const Microsoft::Console::VirtualTerminal::VTID id, const Microsoft::Console::VirtualTerminal::VTParameters parameters) Line 492 C++ Microsoft.Terminal.Control.dll!Microsoft::Console::VirtualTerminal::StateMachine::_SafeExecute<`Microsoft::Console::VirtualTerminal::StateMachine::_ActionCsiDispatch'::`2'::<lambda_1>>(Microsoft::Console::VirtualTerminal::StateMachine::_ActionCsiDispatch::__l2::<lambda_1> && lambda) Line 2039 C++ Microsoft.Terminal.Control.dll!Microsoft::Console::VirtualTerminal::StateMachine::_ActionCsiDispatch(const wchar_t wch) Line 480 C++ Microsoft.Terminal.Control.dll!Microsoft::Console::VirtualTerminal::StateMachine::ProcessCharacter(const wchar_t wch) Line 1778 C++ Microsoft.Terminal.Control.dll!Microsoft::Console::VirtualTerminal::StateMachine::ProcessString(const std::basic_string_view<wchar_t,std::char_traits<wchar_t>> string) Line 1853 C++ Microsoft.Terminal.Control.dll!winrt::Microsoft::Terminal::Control::implementation::ControlCore::_connectionOutputHandler(const winrt::hstring & hstr) Line 1706 C++ Microsoft.Terminal.Control.dll!winrt::impl::delegate<winrt::Microsoft::Terminal::TerminalConnection::TerminalOutputHandler,`winrt::Microsoft::Terminal::TerminalConnection::TerminalOutputHandler::implementation<winrt::Microsoft::Terminal::Control::implementation::ControlCore,void (__cdecl winrt::Microsoft::Terminal::Control::implementation::ControlCore::*)(winrt::hstring const &)>'::`1'::<lambda_218_>>::Invoke(void * output) Line 174 C++ [External Code] The problem, as far as I can make out, is that the `ControlCore` instance is deleted at this point in time. If you look at `ControlCore::Close` method, we're closing the connection asynchronously, which I think means we're still receiving VT sequences (in this case `\e[3J`) after `ControlCore` is gone. Assuming I've understood that correctly, that would probably explain the crash.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/terminal#18338