きりかノート 3冊め

おあそびプログラミング

MacPortsのport:ruby22, ruby21, ruby20を更新

あたらしいバージョンがリリースされていたので対応しました。今回のバージョンはセキュリティ修正(CVE-2015-7551: Fiddle と DL における tainted 文字列使用時の脆弱性について)が含まれています。

以下自分ようのメモ。

2.2 Leopard以前にlibunwind.hがない?

2.2.3が古いOS X(10.5 Leopard以前)でコンパイルエラーがあるらしくパッチが当てられていたけれど、2.2.4ではupstreamで対応された(Bug #11591)ので削除。

2.2, 2.1 仮想マシン上のtest/ruby/test_io.rbでTypeError

先週ようやく10.11に上げたので、10.10の検証(インストールの確認とtest-all流す)はVMWare上の仮想マシンでやった。

2.2.4と2.1のtest-allでTestIOでエラーが4件出る。

     1) Error:
   TestIO#test_close_on_exec:
   TypeError: no implicit conversion from nil to integer

rubyciではOS X上の2.2/2.1はtest-allのエラーはないので、環境かMacPortsのビルドの問題かなあと考えて調べてみる。

まずはport使わずにふつーにconfigure && make。再現することを確認。2.2.3ではテストをパスすることも確認。

2.2.3と2.2.4でconfig.hを比較、上述のlibunwind.hの件だけで関係なさそう。

   --- .ext/include/x86_64-darwin14/ruby/config.h	2015-12-20 01:34:06.000000000 +0900
   +++ ../ruby-2.2.4/.ext/include/x86_64-darwin14/ruby/config.h	2015-12-20 01:07:06.000000000 +0900
   @@ -332,6 +332,7 @@
    #define SET_THREAD_NAME(name) pthread_setname_np(name)
    #define DEFINE_MCONTEXT_PTR(mc, uc) mcontext_t mc = (uc)->uc_mcontext
    #define HAVE_EXECINFO_H 1
   +#define HAVE_LIBUNWIND_H 1
    #define HAVE_BACKTRACE 1
    #define BROKEN_BACKTRACE 1
    #define DLEXT_MAXLEN 7

次にテストスクリプトを比較、RLIMITまわりの設定が追加されてるね。

   --- ../ruby-2.2.3/test/ruby/test_io.rb      2015-08-14 00:53:27.000000000 +0900
   +++ test/ruby/test_io.rb    2015-12-20 10:51:14.000000000 +0900
   @@ -1065,7 +1065,9 @@
      def ruby(*args)
        args = ['-e', '$>.write($<.read)'] if args.empty?
        ruby = EnvUtil.rubybin
   -    f = IO.popen([ruby] + args, 'r+')
   +    opts = {}
   +    opts[:rlimit_nproc] = 1024 if defined?(Process::RLIMIT_NPROC)
   +    f = IO.popen([ruby] + args, 'r+', opts)
        pid = f.pid
        yield(f)
      ensure
   @@ -1120,6 +1122,10 @@

      def test_dup_many
        ruby('-e', <<-'End') {|f|
   +      if defined?(Process::RLIMIT_NOFILE)
   +        lim = Process.getrlimit(Process::RLIMIT_NOFILE)[0]
   +        Process.setrlimit(Process::RLIMIT_NOFILE, [lim, 1024].min)
   +      end
          ok = 0
          a = []
          begin

試してみた感じだと

   opts[:rlimit_nproc] = 1024 if defined?(Process::RLIMIT_NPROC)

ここの"1024"が環境の最大値を超えてるとだめっぽい。

   # OS X 10.11.2 実機
   % ruby2.2 -e 'p Process.getrlimit(Process::RLIMIT_NPROC)'
   [709, 1064]
   # OS X 10.10.5 VMWare fusion
   % ruby2.2 -e 'p Process.getrlimit(Process::RLIMIT_NPROC)'
   [266, 532]

仮想のほうで1024を532にするとテストをパスするようになる。533だとエラーになる。

ruby本体の問題ではなさそうなのでとりあえず無視することに。ちゃんと調べたらbugs.r-l.oにレポートだそう。

(2015-12-22 追記)Bug #11852として報告して、送ったパッチもマージされた。ありがとうございます!

2.0.0 rubygems/test_gem_remote_fetcher.rbで"dh key too small"

例によってopensslのバージョンが上がったことで要求されるサイズが増えたみたい。

test_gem_remote_fetcher.rbの`OpenSSL::PKey::DH.new(128)`を256にしてみたけど、test-allで流すとエラーのぜんぶは解消できなくってめんどうになってあきらめた。