[[diary/Kojima]]

・GCC-4.8.3 bug

GCC-4.8.3でGlibc-2.20をビルド、インストールしてみたところ、64ビット環境では問題ないものの、VirtualBoxで動かしている32ビット環境でコンソールからログインできなくなってしまった。

あれれ、と思って外部からsshで接続すると問題なくログインできる。「???」となりながら、ログファイルを調べてみると、postfixのログにこんなメッセージが残っている。

 Oct 15 17:44:19 vm51_32 postfix/master[3087]: 
  warning: /usr/libexec/postfix/pickup: bad command startup -- throttling
 Oct 15 17:45:19 vm51_32 postfix/pickup[3983]: 
  fatal: setgid(16): Function not implemented
 Oct 15 17:45:20 vm51_32 postfix/master[3087]: 
  warning: process /usr/libexec/postfix/pickup pid 3983 exit status 1

「なぜにsetgid?」と首をひねりながら、しばらく調べてみると、Glibc-2.20の[[リリース情報:https://sourceware.org/glibc/wiki/Release/2.20]]にこんな記述が。

 3.1.22. x86 (32-bit, Linux)
 
 Some GCC releases miscompile the setxid support code in NPTL. 
 This results in functions such as setgid failing with ENOSYS 
 because an totally bogus system call number is being passed to 
 the kernel. This has been fixed as GCC bug 61801.
 
 Build system: x86_64 GNU/Linux, gcc version 4.8.3 20140624 
 (Red Hat 4.8.3-1  (GCC), GNU assembler version 2.23.2 
 (x86_64-redhat-linux) using BFD version version 2.23.2, 
 Linux 3.15.3-200.fc20.x86_64 (Carlos O'Donell). 
 Built with -m32' and targetting i686-pc-linux-gnu'.

どうやらこれっぽいな、とGCCのバグ情報を調べてみると、[[条件を一つ追加しているだけ:https://gcc.gnu.org/viewcvs/gcc/branches/gcc-4_9-branch/gcc/sched-deps.c?r1=212739&r2=212738&pathrev=212739]]だった。

ホントにこれだけで直るのか?と疑問に思ったので、パッチをあててないGCC-4.8.3とパッチ済みでGlibc-2.20をビルドして、make checkしたところ、パッチ前のGCCでは

 FAIL: nptl/tst-setuid3
 FAIL: rt/tst-cpuclock2
 Summary of test results:
       2 FAIL
    1667 PASS
     120 XFAIL
       4 XPASS

だったのに対し、パッチ済みだと、

 Summary of test results:
    1669 PASS
     120 XFAIL
      4 XPASS

となった。「なるほど」とビルドし直したglibc-2.20にアップデートしたところ、コンソールからログインできない問題も無事解決。

よくこんなの見つけたなぁ、、と思う反面、glibcのテストスーツでちゃんとチェックできていたことを見ると、やはり make check は必須かと反省。

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS