From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7868) id 72A83385AE70; Sun, 19 Jun 2022 09:28:02 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 72A83385AE70 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Takashi Yano To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: console: Handle setting very long window title correctly. X-Act-Checkin: newlib-cygwin X-Git-Author: Takashi Yano X-Git-Refname: refs/heads/master X-Git-Oldrev: fdbd1539329ad669606767ab5a63a16f825b4c45 X-Git-Newrev: fe10e8f03a024fb3653a97780addd572e98889cb Message-Id: <20220619092802.72A83385AE70@sourceware.org> Date: Sun, 19 Jun 2022 09:28:02 +0000 (GMT) X-BeenThere: cygwin-cvs@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Cygwin core component git logs List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 19 Jun 2022 09:28:02 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dnewlib-cygwin.git;h=3Dfe10e8f03a0= 24fb3653a97780addd572e98889cb commit fe10e8f03a024fb3653a97780addd572e98889cb Author: Takashi Yano Date: Sun Jun 19 12:53:16 2022 +0900 Cygwin: console: Handle setting very long window title correctly. =20 - Previously, the console code could not handle escape sequence setting window title longer than 256 byte correctly. This patch fixes the issue. Addresses: https://cygwin.com/pipermail/cygwin/2022-June/251662.html Diff: --- winsup/cygwin/fhandler_console.cc | 90 ++++++++++++++++++++++++++++-------= ---- winsup/cygwin/release/3.3.6 | 3 ++ 2 files changed, 69 insertions(+), 24 deletions(-) diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_con= sole.cc index 12c2c4f12..345117888 100644 --- a/winsup/cygwin/fhandler_console.cc +++ b/winsup/cygwin/fhandler_console.cc @@ -73,19 +73,59 @@ private: static const size_t WPBUF_LEN =3D 256u; char buf[WPBUF_LEN]; size_t ixput; + HANDLE output_handle; public: + void init (HANDLE &handle) + { + output_handle =3D handle; + empty (); + } inline void put (char x) { - if (ixput < WPBUF_LEN) - buf[ixput++] =3D x; + if (ixput =3D=3D WPBUF_LEN) + send (); + buf[ixput++] =3D x; } inline void empty () { ixput =3D 0u; } - inline void send (HANDLE &handle) + inline void send () { + if (!output_handle) + { + empty (); + return; + } + mbtowc_p f_mbtowc =3D + (__MBTOWC =3D=3D __ascii_mbtowc) ? __utf8_mbtowc : __MBTOWC; wchar_t bufw[WPBUF_LEN]; - DWORD len =3D sys_mbstowcs (bufw, WPBUF_LEN, buf, ixput); + DWORD len =3D 0; + mbstate_t ps; + memset (&ps, 0, sizeof (ps)); + char *p =3D buf; + while (ixput) + { + int bytes =3D f_mbtowc (_REENT, bufw + len, p, ixput, &ps); + if (bytes < 0) + { + if ((size_t) ps.__count < ixput) + { /* Discard one byte and retry. */ + p++; + ixput--; + memset (&ps, 0, sizeof (ps)); + continue; + } + /* Halfway through the multibyte char. */ + memmove (buf, p, ixput); + break; + } + else + { + len++; + p +=3D bytes; + ixput -=3D bytes; + } + } acquire_attach_mutex (mutex_timeout); - WriteConsoleW (handle, bufw, len, NULL, 0); + WriteConsoleW (output_handle, bufw, len, NULL, 0); release_attach_mutex (); } } wpbuf; @@ -1485,6 +1525,7 @@ fhandler_console::open (int flags, mode_t) } set_output_handle (h); handle_set.output_handle =3D h; + wpbuf.init (get_output_handle ()); =20 setup_io_mutex (); handle_set.input_mutex =3D input_mutex; @@ -2353,7 +2394,7 @@ fhandler_console::char_command (char c) wpbuf.put (c); if (wincap.has_con_esc_rep ()) /* Just send the sequence */ - wpbuf.send (get_output_handle ()); + wpbuf.send (); else if (last_char && last_char !=3D L'\n') { acquire_attach_mutex (mutex_timeout); @@ -2367,7 +2408,7 @@ fhandler_console::char_command (char c) con.scroll_region.Bottom =3D con.args[1] ? con.args[1] - 1 : -1; wpbuf.put (c); /* Just send the sequence */ - wpbuf.send (get_output_handle ()); + wpbuf.send (); break; case 'L': /* IL */ if (wincap.has_con_broken_il_dl ()) @@ -2400,7 +2441,7 @@ fhandler_console::char_command (char c) srBottom + 1 - con.b.srWindow.Top); WriteConsoleW (get_output_handle (), bufw, wcslen (bufw), 0, 0); wpbuf.put ('T'); - wpbuf.send (get_output_handle ()); + wpbuf.send (); __small_swprintf (bufw, L"\033[%d;%dr", srTop + 1 - con.b.srWindow.Top, srBottom + 1 - con.b.srWindow.Top); @@ -2414,7 +2455,7 @@ fhandler_console::char_command (char c) { wpbuf.put (c); /* Just send the sequence */ - wpbuf.send (get_output_handle ()); + wpbuf.send (); } break; case 'M': /* DL */ @@ -2437,7 +2478,7 @@ fhandler_console::char_command (char c) acquire_attach_mutex (mutex_timeout); WriteConsoleW (get_output_handle (), bufw, wcslen (bufw), 0, 0); wpbuf.put ('S'); - wpbuf.send (get_output_handle ()); + wpbuf.send (); __small_swprintf (bufw, L"\033[%d;%dr", srTop + 1 - con.b.srWindow.Top, srBottom + 1 - con.b.srWindow.Top); @@ -2451,7 +2492,7 @@ fhandler_console::char_command (char c) { wpbuf.put (c); /* Just send the sequence */ - wpbuf.send (get_output_handle ()); + wpbuf.send (); } break; case 'J': /* ED */ @@ -2480,13 +2521,13 @@ fhandler_console::char_command (char c) } else /* Just send the sequence */ - wpbuf.send (get_output_handle ()); + wpbuf.send (); break; case 'h': /* DECSET */ case 'l': /* DECRST */ wpbuf.put (c); /* Just send the sequence */ - wpbuf.send (get_output_handle ()); + wpbuf.send (); if (con.saw_question_mark) { bool need_fix_tab_position =3D false; @@ -2515,7 +2556,7 @@ fhandler_console::char_command (char c) } wpbuf.put (c); /* Just send the sequence */ - wpbuf.send (get_output_handle ()); + wpbuf.send (); break; case 'm': if (con.saw_greater_than_sign) @@ -2523,13 +2564,13 @@ fhandler_console::char_command (char c) /* Text attribute settings */ wpbuf.put (c); /* Just send the sequence */ - wpbuf.send (get_output_handle ()); + wpbuf.send (); break; default: /* Other escape sequences */ wpbuf.put (c); /* Just send the sequence */ - wpbuf.send (get_output_handle ()); + wpbuf.send (); break; } return; @@ -3380,7 +3421,7 @@ fhandler_console::write (const void *vsrc, size_t len) /* For xterm mode only */ /* Just send the sequence */ wpbuf.put (*src); - wpbuf.send (get_output_handle ()); + wpbuf.send (); } else if (con.savex >=3D 0 && con.savey >=3D 0) cursor_set (false, con.savex, con.savey); @@ -3394,7 +3435,7 @@ fhandler_console::write (const void *vsrc, size_t len) /* For xterm mode only */ /* Just send the sequence */ wpbuf.put (*src); - wpbuf.send (get_output_handle ()); + wpbuf.send (); } else cursor_get (&con.savex, &con.savey); @@ -3427,7 +3468,7 @@ fhandler_console::write (const void *vsrc, size_t len) } else wpbuf.put (*src); - wpbuf.send (get_output_handle ()); + wpbuf.send (); con.state =3D normal; wpbuf.empty(); } @@ -3452,7 +3493,7 @@ fhandler_console::write (const void *vsrc, size_t len) handled and just sent them. */ wpbuf.put (*src); /* Just send the sequence */ - wpbuf.send (get_output_handle ()); + wpbuf.send (); con.state =3D normal; wpbuf.empty(); } @@ -3549,7 +3590,7 @@ fhandler_console::write (const void *vsrc, size_t len) { wpbuf.put (*src); if (wincap.has_con_24bit_colors () && !con_is_legacy) - wpbuf.send (get_output_handle ()); + wpbuf.send (); wpbuf.empty (); con.state =3D normal; src++; @@ -3566,7 +3607,7 @@ fhandler_console::write (const void *vsrc, size_t len) if (*src < ' ') { if (wincap.has_con_24bit_colors () && !con_is_legacy) - wpbuf.send (get_output_handle ()); + wpbuf.send (); else if (*src =3D=3D '\007' && con.state =3D=3D gettitle) set_console_title (con.my_title_buf); con.state =3D normal; @@ -3591,7 +3632,7 @@ fhandler_console::write (const void *vsrc, size_t len) /* Send OSC Ps; Pt BEL other than OSC Ps; ? BEL */ if (wincap.has_con_24bit_colors () && !con_is_legacy && !con.saw_question_mark) - wpbuf.send (get_output_handle ()); + wpbuf.send (); con.state =3D normal; wpbuf.empty(); } @@ -3604,7 +3645,7 @@ fhandler_console::write (const void *vsrc, size_t len) /* Send OSC Ps; Pt ST other than OSC Ps; ? ST */ if (wincap.has_con_24bit_colors () && !con_is_legacy && !con.saw_question_mark) - wpbuf.send (get_output_handle ()); + wpbuf.send (); con.state =3D normal; } else @@ -3868,6 +3909,7 @@ fhandler_console::fixup_after_fork_exec (bool execing) { set_unit (); setup_io_mutex (); + wpbuf.init (get_output_handle ()); =20 if (!execing) return; diff --git a/winsup/cygwin/release/3.3.6 b/winsup/cygwin/release/3.3.6 index bccc5124c..49ac58ba4 100644 --- a/winsup/cygwin/release/3.3.6 +++ b/winsup/cygwin/release/3.3.6 @@ -14,3 +14,6 @@ Bug Fixes - Fix a regression that prevented Cygwin from starting if cygwin1.dll is in the root directory. Addresses: https://cygwin.com/pipermail/cygwin/2022-May/251548.html + +- Handle setting very long window title correctly in console. + Addresses: https://cygwin.com/pipermail/cygwin/2022-June/251662.html