ttt

getttyent

FreeBSD 10.2で、nss_ldapが使われていると、/bin/cshがSIGINTで死ぬ

2015-10-01 21:51:14 | デジタル・インターネット

今日気がついた、困ったこと。

FreeBSD 10.2-RELEASE amd64

たぶん、昨日、freebsd-updateしたような気がするので、最新

# freebsd-version -ku
10.2-RELEASE
10.2-RELEASE-p4

困った現象

対話的に使っているシェルの/bin/tcshが、Ctrl+Cすると、死ぬ。

Ctrl+Cというか、つまりは、SIGINT。

ようするに、対話的に使っているシェルである/bin/tcsh、/bin/cshにSIGINTを送ると、そのシェルが終了してしまう、ってこと。

Window環境で、Ctrl+Cを連打すると、ターミナルのウィンドウがどんどん閉じてく。

こんなの、使えない!

なんじゃこりゃー!とビックリして、なぜそうなるか調べてみました。

tcshのソースコード、汚い。

わけわからん。

で、この現象が起きるホストと、起きないホストがあることに気がつきました。

違いは、LDAP。

nss_ldap.soが使われているとき、SIGINTで対話的に動作中の/bin/cshが死にます。

再現方法

(0)
freebsd-updateで、最新の状態にしておく。どうもlibcが関係している。
MD5 (/lib/libc.so.7) = f3b385a35cb363c1bc5bf78686c649c1
のときに、この現象がおきる。

(1)
pkg install nss_ldap
して、インストール。

(2)
/etc/nsswitch.confでたとえば
group: files ldap
とかに変更。ただし、これをやると、LDAPサーバが無い状態では、sshログインさえできなくなってしまう。なので、ログインしておいてから(作業用の端末を複数開いておいてから)、/etc/nsswitch.confを書き換える。

(3)
/bin/csh
を実行する

(4)
cd /tmp
とかしておく。これは死んだかどうか区別するため。
あと、lsとかのコマンド(csh built-inコマンド以外)を1~2回実行したほうが、再現しやすい。

(5)
(3)で起動したcshにSIGINTを送る

(6)
たぶん、cshが死ぬ。カレントディレクトリが、(3)をする前のところになっているから、区別できるはず



nss_ldap.soだけでなくて、/lib/libc.so.7が重要。

MD5 (/lib/libc.so.7) = f3b385a35cb363c1bc5bf78686c649c1
で不具合発生。

MD5 (/lib/libc.so.7) = ad3e5dac92fd7c3cf445cad7d354af6c
だと大丈夫。

libc.so.7がいつ差し替えられたのか、ということになるが、直近の、これではないか?

https://www.freebsd.org/security/advisories/FreeBSD-EN-15:17.libc.asc

Topic:          libc incorrectly handles signals for multi-threaded processes

Category:       core
Module:         libc
Announced:      2015-09-16
Credits:        Konstantin Belousov
Affects:        FreeBSD 10.2
Corrected:      2015-09-05 08:55:51 UTC (stable/10, 10.2-STABLE)
                2015-09-16 20:59:41 UTC (releng/10.2, 10.2-RELEASE-p3)

というわけで、だれか、なんとかしてください。

とりあえずfreebsd-update rollbackしました。

tcshのコードをいじったり、gdbでおっかけたりして、ちょっとは調べて見たのですが、$HOME/.cshrcをいじると、挙動が微妙に変化したりで、まだよくわからないです。

tcshがもっているシグナルハンドラが、登録されたり、されなかったり、みたいな、謎な動作をしてます。

$HOME/.cshrcを読んで実行している最中は、SIGINTを受け付けるようにしていて、対話的処理が始まると、SIGINTを無視するようになるのが、どういうわけか、SIGINTを受けつけつつ、対話的処理が始まっている、みたいな???

 


2 コメント

コメント日が  古い順  |   新しい順
http://lut.eee.u-ryukyu.ac.jp/ (おさな)
2016-06-03 22:46:44
はじめまして。

同じ問題で困っており、去年の年末くらいにこの記事を拝読して、自分だけの環境の問題じゃないのか、と安心して (?) おりました。

最近は ports に、nss_ldap と pam_ldap の派生プロジェクトとして開発された、nss-pam-ldapd というのが入っており、これに切り替えてみたところ、csh / tcsh が ctrl+c で終了する問題、どうやら解決したようです (僕自身はこれを機に zsh に乗り換えてしまったのですが、root は csh のままなので、解決してよかったです...)。

もうご解決済みかもしれませんが、ご参考になれば幸いです。
返信する
ありがとうございます (本人)
2016-07-17 00:13:38
そうだったんですね。今度試してみます。
私は、libc.soだけ差し替えて、その場しのぎの対処をしてました。
返信する

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。