Bug #5423

readlineの入力待機中に端末のウィンドウサイズ変更すると入力内容が乱れる

Added by Takuto Matsuu over 3 years ago. Updated almost 3 years ago.

[ruby-dev:44586]
Status:Closed
Priority:Normal
Assignee:Kouji Takao
ruby -v:ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux] Backport:

Description

Readline.readline("> ")の入力待機中にターミナルのウィンドウサイズを変更すると、
入力内容がウィンドウサイズ変更に合わせて変化せず、画面が乱れます。

readlineがSIGWINCHに反応しないように設定されているのが原因のようです。

revision 24140で追加されたrl_catch_sigwinch = 0;が該当部分になります。
rl_catch_signals=0を設定した場合でも、SIGWINCHは反応すべき(rl_catch_sigwinch=1)だと思います。

Index: ChangeLog

--- ChangeLog (revision 24139)
+++ ChangeLog (revision 24140)
@@ -1,3 +1,11 @@
+Thu Jul 16 12:42:10 2009 NARUSE, Yui naruse@ruby-lang.org
+
+ * ext/readline/readline.c (readline_readline): rl_free_line_state
+ before rl_cleanup_after_signal.
+
+ * ext/readline/readline.c (Init_readline): set rl_catch_signals and
+ rl_catch_signwinch as 0.
+
Thu Jul 16 08:59:22 2009 Koichi Sasada ko1@atdot.net

* node.h, vm_core.h, variable.c: rename global_entry to rb_global_entry.

Index: ext/readline/readline.c

--- ext/readline/readline.c (revision 24139)
+++ ext/readline/readline.c (revision 24140)
@@ -253,6 +253,7 @@
if (status) {
#if defined HAVE_RL_CLEANUP_AFTER_SIGNAL
/* restore terminal mode and signal handler*/
+ rl_free_line_state();
rl_cleanup_after_signal();
#elif defined HAVE_RL_DEPREP_TERM_FUNCTION
/* restore terminal mode */
@@ -1450,6 +1451,8 @@
#elif defined HAVE_RL_EVENT_HOOK
rl_event_hook = readline_event;
#endif
+ rl_catch_signals = 0;
+ rl_catch_sigwinch = 0;
#ifdef HAVE_RL_CLEAR_SIGNALS
rl_clear_signals();
#endif

readline-sigwinch.patch Magnifier (394 Bytes) Takuto Matsuu, 10/08/2011 10:19 AM


Related issues

Related to Backport193 - Backport #5023: irb does not like window resizes Closed 07/13/2011
Related to Ruby trunk - Bug #1118: irb core dumps with 'CTRL-C' with zsh Closed 02/06/2009

Associated revisions

Revision 36130
Added by Yui NARUSE almost 3 years ago

  • ext/readline/readline.c (Init_readline): don't set 0 to rl_catch_signals and rl_catch_sigwinch. [Bug #5423]

Revision 36130
Added by Yui NARUSE almost 3 years ago

  • ext/readline/readline.c (Init_readline): don't set 0 to rl_catch_signals and rl_catch_sigwinch. [Bug #5423]

Revision 36653
Added by Yui NARUSE over 2 years ago

  • ext/readline/readline.c (Init_readline): rl_catch_signals=0 returns back. Without this, on FreeBSD9 and readline 6.2 irb can't catch C. [Bug #5423]

Revision 36653
Added by Yui NARUSE over 2 years ago

  • ext/readline/readline.c (Init_readline): rl_catch_signals=0 returns back. Without this, on FreeBSD9 and readline 6.2 irb can't catch C. [Bug #5423]

History

#2 Updated by Shota Fukumori over 3 years ago

  • Status changed from Open to Assigned
  • Assignee set to Kouji Takao

#3 Updated by Kouji Takao over 3 years ago

  • Status changed from Assigned to Feedback

ご報告ありがとうございます。

ただ、こちら(OSX 10.6、ruby 2.0.0dev (2011-12-22 trunk 34097) [x86_64-darwin10.8.0]、 GNU Readline 6.2)では「画面が乱れます」を再現ができませんでした。
Readline.readline("> ")で何を入力しているときに、ウインドウサイズをどれくらい大きく、または小さくすると再現するのでしょうか。

#4 Updated by Tomoyuki Chikanaga over 3 years ago

元報告者と現象が同じかどうかわかりませんが、Ubuntu 10.04.3 で ruby 2.0.0dev (2012-01-10 trunk 34255) [i686-linux] + GNU Readline 6.1 で以下のような現象が確認できます。

$ echo $TERM
xterm
$ ruby -rreadline -e 'Readline.readline("> ")'

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

↑端末の幅が 80 としてここで折り返す前まで文字を入力しておきます
その後端末の幅を小さくすると

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

というように折り返されずにバッファの前半だけ表示された状態になります。
ここでさらに "bbb" と入力すると折り返されます

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
b

また端末の幅を戻しても、表示されるのは切り詰められた状態のままですが、
実際にはバッファには空白になった右半分の文字も存在していて Ctrl-L で再描画すると描画されます。
また逆に起動後に端末の幅を拡げた時も、折り返し位置が変化しません。

上記の動作は提示されているパッチで直るようです。 なおわたしの環境でも SnowLeopard 上で MacPorts でインストールした GNU Readline を使った場合にはこの現象は発生しないようでした。

#5 Updated by Yusuke Endoh almost 3 years ago

  • Status changed from Feedback to Assigned
  • Assignee changed from Kouji Takao to Yui NARUSE

#5023 もこれと同じ原因だと思います。再現します。

r24140#1118 で成瀬さんが FreeBSD のために入れたようですが、なんでこれで SEGV 回避になるのか説明がなくて
よくわかりませんが、r24140 を revert すると問題の現象が消えるので regression だと思います。

ということで、成瀬さんお願いします。

Yusuke Endoh mame@tsg.ne.jp

#6 Updated by Yui NARUSE almost 3 years ago

  • Assignee changed from Yui NARUSE to Kouji Takao

たぶん readline した後に rl_free_line_state() するのが本質だと思います。
残りはなんで入れたんだろう、今はF9+Readline5.2で消しても再現しないので、
+ rl_catch_signals = 0;
+ rl_catch_sigwinch = 0;
の部分は消して大丈夫だと思います。

#7 Updated by Kouji Takao almost 3 years ago

  • Category set to ext

mameさん、naruseさん、情報ありがとうございます。
こちらの環境では再現しないため、どうにも困っていました。
いただいた情報を元に少し調べてみます。
Readlineのバージョン(5.X, 6.1, 6.2)も関係があるのかもしれませんね。

なんにせよ、SEGVとかregressionは早くなんとかしますね。

#8 Updated by Yui NARUSE almost 3 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r36130.
Takuto, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • ext/readline/readline.c (Init_readline): don't set 0 to rl_catch_signals and rl_catch_sigwinch. [Bug #5423]

Also available in: Atom PDF