From: "akira yamada / やまだあきら" Date: 2008-06-05T19:52:51+09:00 Subject: [ruby-dev:34950] Re: Ruby 1.8.7-preview4 test-all failed in OpenSSL::TestSSL Akinori MUSHA さんは書きました: >>> この話題についていろいろ試していて気付いたのですが >>> OpenSSL::SSL::SSLSocket.new(TCPSocket.new("localhost",80)).session >>> でsegvします。 > >  その状況を教えてください。OpenSSLの不具合なのか、それともRubyの > 呼び出し方が不適切なせいなのかが気になります。 > >  後者ならば、SEGVするような呼び出し方をさせないworkaroundが必要と > 思います。 手元では $ ruby -rsocket -ropenssl -e 'OpenSSL::SSL::SSLSocket.new(TCPSocket.new("localhost",80)).session' /usr/lib/ruby/1.8/openssl/ssl.rb:129: [BUG] Segmentation fault ruby 1.8.7 (2008-05-31 patchlevel 0) [i486-linux] zsh: abort ruby -rsocket -ropenssl -e という感じになります。 OpenSSL::SSL::Sessionのinitializeで struct SSLをData_Get_Structしたとき、 SSLSocket#connectを呼び出す前だと これはNULLなので…… ということかなと思っています。 とりあえず避けるだけなら↓でも避けられますが struct SSLを初期化するべきなのかもしれません。 --- ext/openssl/ossl_ssl_session.c (リビジョン 16835) +++ ext/openssl/ossl_ssl_session.c (作業コピー) @@ -46,6 +46,9 @@ SSL *ssl; Data_Get_Struct(arg1, SSL, ssl); +if (!ssl) { + ossl_raise(eSSLSession, "no session available"); +} if ((ctx = SSL_get1_session(ssl)) == NULL) ossl_raise(eSSLSession, "no session available"); -- ay