Skip to content

Commit

Permalink
Fix input corruption for high code points (#13667)
Browse files Browse the repository at this point in the history
We must use 65535 as `MAX_PARAMETER_VALUE` in order for us to properly parse
win32-input-mode sequences, which transmit UTF-16 characters as parameters.

Closes #12977

## Validation Steps Performed
* Call `SendInput` with 🙁 (`L'\xD83D'`, `L'\xDE41'`)
* 🙁 appears on the input line ✅
  • Loading branch information
lhecker authored Aug 4, 2022
1 parent 1a77834 commit 74cdffe
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 7 deletions.
1 change: 0 additions & 1 deletion src/terminal/parser/stateMachine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2014,7 +2014,6 @@ void StateMachine::ResetState() noexcept
// into the given size_t. All existing value is moved up by 10.
// - For example, if your value had 437 and you put in the printable number 2,
// this function will update value to 4372.
// - Clamps to 32767 if it gets too big.
// Arguments:
// - wch - Printable character to accumulate into the value (after conversion to number, of course)
// - value - The value to update with the printable character. See example above.
Expand Down
10 changes: 5 additions & 5 deletions src/terminal/parser/stateMachine.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@ Module Name:

namespace Microsoft::Console::VirtualTerminal
{
// The DEC STD 070 reference recommends supporting up to at least 16384 for
// parameter values, so 32767 should be more than enough. At most we might
// want to increase this to 65535, since that is what XTerm and VTE support,
// but for now 32767 is the safest limit for our existing code base.
constexpr VTInt MAX_PARAMETER_VALUE = 32767;
// The DEC STD 070 reference recommends supporting up to at least 16384
// for parameter values. 65535 is what XTerm and VTE support.
// GH#12977: We must use 65535 to properly parse win32-input-mode
// sequences, which transmit the UTF-16 character value as a parameter.
constexpr VTInt MAX_PARAMETER_VALUE = 65535;

// The DEC STD 070 reference requires that a minimum of 16 parameter values
// are supported, but most modern terminal emulators will allow around twice
Expand Down
2 changes: 1 addition & 1 deletion src/terminal/parser/ut_parser/OutputEngineTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1589,7 +1589,7 @@ class StateMachineExternalTest final
}
else if (uiGiven > MAX_PARAMETER_VALUE)
{
*uiExpected = MAX_PARAMETER_VALUE; // 32767 is our max value.
*uiExpected = MAX_PARAMETER_VALUE;
}
}

Expand Down

0 comments on commit 74cdffe

Please sign in to comment.