Re: [PATCH] Cygwin: console: Fix handling of surrogate pairs

Takashi Yano <[email protected]> Fri, 29 May 2026 11:36:00 +0900
Newsgroups gmane.os.cygwin.patches
Message-ID <[email protected]>
On Thu, 28 May 2026 15:33:24 +0200 (CEST)
Johannes Schindelin wrote:
> Hi Takashi,
> 
> On Tue, 26 May 2026, Takashi Yano wrote:
> 
> > The commit 782aac590af7 introduced surrogate-pair handling. However,
> > it does not work as expected in the legacy console. This is because
> > a KeyDown event for ALT key with UnicodeChar == 0 is inserted the
> > between surrogate pair. The current code reads the next key event
> > unconditionally for the second UnicodeChar, but it is not correct.
> > This patch searches the next appropriate key event with a valid
> > UnicodeChar, ensuring that the second code unit is valid.
> > 
> > Fixes: 782aac590af7 ("Cygwin: console: Handle Unicode surrogate pairs.")
> > Signed-off-by: Takashi Yano <[email protected]>
> > Reviewed-by:
> > ---
> >  winsup/cygwin/fhandler/console.cc | 20 ++++++++++++++++----
> >  1 file changed, 16 insertions(+), 4 deletions(-)
> > 
> > diff --git a/winsup/cygwin/fhandler/console.cc b/winsup/cygwin/fhandler/console.cc
> > index 6fd4cd965..45eff6efe 100644
> > --- a/winsup/cygwin/fhandler/console.cc
> > +++ b/winsup/cygwin/fhandler/console.cc
> > @@ -1452,9 +1452,21 @@ fhandler_console::process_input_message (void)
> >  	    }
> >  	  else
> >  	    {
> > -	      WCHAR second = unicode_char >= 0xd800 && unicode_char <= 0xdbff
> > -		  && i + 1 < total_read ?
> > -		  input_rec[i + 1].Event.KeyEvent.uChar.UnicodeChar : 0;
> > +	      WCHAR second = 0;
> > +	      DWORD second_pos = i;
> > +	      if (unicode_char >= 0xd800 && unicode_char <= 0xdbff)
> > +		for (DWORD j = i + 1; j < total_read; j++)
> > +		  {
> > +		    /* Do not check bKeyDown. bKeyDown is 0 for surrogate
> > +		       pair in legacy console */
> > +		    if (input_rec[j].EventType == KEY_EVENT &&
> > +			input_rec[j].Event.KeyEvent.uChar.UnicodeChar)
> > +		      {
> > +			second = input_rec[j].Event.KeyEvent.uChar.UnicodeChar;
> > +			second_pos = j;
> > +			break;
> > +		      }
> > +		  }
> >  
> >  	      if (second < 0xdc00 || second > 0xdfff)
> >  		{
> > @@ -1465,7 +1477,7 @@ fhandler_console::process_input_message (void)
> 
> It's a bit unfortunate that the diff here hides the fact that the
> following is in the `else` branch...
> 
> In any case, the patch makes sense to me, and I really appreciate the
> commit message that puts the diff into context.

Thanks for reviewing. Pushed.

-- 
Takashi Yano <[email protected]>