Ruby 1.8.7-preview4 test-all failed in OpenSSL::TestSSL

e$B$$$^$$$G$9!#e(B

Ruby 1.8.7-preview4 e$B$G$9$,!"e(Btest-all
e$B$NESCf$G%(%i!<$K$J$j$^$9!#4{=P$Ge(B
e$B$7$g$&$+!)e(BDebian GNU/Linux sid e$B$G!"e(Blibssl-dev e$B$Oe(B
0.9.8g-10 e$B$G$9!#$A$Je(B
e$B$_$K!“e(B0.9.7e-3sarge5 e$B$Je(B sarge
e$B$N4D6-$G$O%(%i!<$K$J$j$^$;$s$G$7$?!#B>$Ke(B
e$B2?$+I,MW$J>pJs$,$”$l$P65$($F$/$@$5$$!#$h$m$7$/$*4j$$$7$^$9!#e(B

$ sh configure --prefix=/home/ruby
$ make
$ make install-nodoc
$ make test-all TESTS=-v
(snip)
test_readline(OpenSSL::TestPair): .
test_readpartial(OpenSSL::TestPair): .
test_client_auth(OpenSSL::TestSSL): .
test_client_session(OpenSSL::TestSSL): F
test_connect_and_close(OpenSSL::TestSSL): .
test_ctx_setup(OpenSSL::TestSSL): .
test_parallel(OpenSSL::TestSSL): .
test_post_connection_check(OpenSSL::TestSSL): .
test_read_and_write(OpenSSL::TestSSL): .
test_server_session(OpenSSL::TestSSL):
/home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/assertions.rb:48:in
assert_block': <0> expected but was (Test::Unit::AssertionFailedError) <1>. from /home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/assertions.rb:495:in_wrap_assertion’
from
/home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/assertions.rb:46:in
assert_block' from /home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/assertions.rb:83:inassert_equal’
from ./test/openssl/test_ssl.rb:469:in test_server_session' from ./test/openssl/test_ssl.rb:86:incall’
from ./test/openssl/test_ssl.rb:86:in server_loop' from ./test/openssl/test_ssl.rb:84:instart’
from ./test/openssl/test_ssl.rb:84:in server_loop' from ./test/openssl/test_ssl.rb:76:inloop’
from ./test/openssl/test_ssl.rb:76:in server_loop' from ./test/openssl/test_ssl.rb:124:instart_server’
from ./test/openssl/test_ssl.rb:122:in initialize' from ./test/openssl/test_ssl.rb:122:innew’
from ./test/openssl/test_ssl.rb:122:in start_server' from ./test/openssl/test_ssl.rb:499:intest_server_session’
from
/home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/testcase.rb:78:in
__send__' from /home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/testcase.rb:78:inrun’
from
/home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/testsuite.rb:34:in
run' from /home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/testsuite.rb:33:ineach’
from
/home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/testsuite.rb:33:in
run' from /home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/testsuite.rb:34:inrun’
from
/home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/testsuite.rb:33:in
each' from /home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/testsuite.rb:33:inrun’
from
/home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/testsuite.rb:34:in
run' from /home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/testsuite.rb:33:ineach’
from
/home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/testsuite.rb:33:in
run' from /home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/ui/testrunnermediator.rb:46:inrun_suite’
from
/home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/ui/console/testrunner.rb:67:in
start_mediator' from /home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/ui/console/testrunner.rb:41:instart’
from
/home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/ui/testrunnerutilities.rb:29:in
run' from /home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/autorunner.rb:216:inrun’
from
/home/ruby/.src/ruby-1.8.7-preview4/lib/test/unit/autorunner.rb:12:in
`run’
from ./test/runner.rb:7
make: *** [test-all] Error 1

At Thu, 29 May 2008 22:56:48 +0900,
Nobuhiro IMAI wrote:

Ruby 1.8.7-preview4 ですが、test-all の途中でエラーになります。既出で
しょうか?Debian GNU/Linux sid で、libssl-dev は 0.9.8g-10 です。ちな
みに、0.9.7e-3sarge5 な sarge の環境ではエラーになりませんでした。他に
ä½•ã‹å¿…è¦ãªæƒ…å ±ãŒã‚ã‚Œã°æ•™ãˆã¦ãã ã•ã„ã€‚ã‚ˆã‚ã—ããŠé¡˜ã„ã—ã¾ã™ã€‚

 わかる方いますか?OpenSSLに疎いので、結果がまずいのかテストが
まずいのか私には判断できません。

 今日(31æ—¥)中に1.8.7ã‚’å‡ºã™ã®ã§ã€ä½•ã‹ã‚ã‚Œã°æƒ…å ±ã‚’ãã ã•ã„ã€‚

test_ctx_setup(OpenSSL::TestSSL): .
from ./test/openssl/test_ssl.rb:86:in server_loop' from ./test/openssl/test_ssl.rb:84:instart’
from ./test/openssl/test_ssl.rb:84:in server_loop' from ./test/openssl/test_ssl.rb:76:inloop’
from ./test/openssl/test_ssl.rb:76:in server_loop' from ./test/openssl/test_ssl.rb:124:instart_server’
from ./test/openssl/test_ssl.rb:122:in initialize' from ./test/openssl/test_ssl.rb:122:innew’
from ./test/openssl/test_ssl.rb:122:in start_server' from ./test/openssl/test_ssl.rb:499:intest_server_session’
(snip)

e$B@>;3OB9-$G$9!#e(B

At Sat, 31 May 2008 01:25:42 +0900,
Akinori MUSHA wrote:

e$B!!$o$+$kJ}$$$^$9$+!)e(BOpenSSLe$B$KAB$$$N$G!"7k2L$,$^$:$$$N$+%F%9%H$,e(B
e$B$^$:$$$N$+;d$K$OH=CG$G$-$^$;$s!#e(B

e$B!!:#F|e(B(31e$BF|e(B)e$BCf$Ke(B1.8.7e$B$r=P$9$N$G!“2?$+$”$l$P>pJs$r$/$@$5$$!#e(B

trunke$B$NJ}$G$be(Btestrb-trunk test/openssl
-ve$B$G0J2<$N$h$&$Ke(B5Fe$B$@$C$?$N$G!"e(B
Failuree$B$K$J$k$N$Oe(Bopenssle$B$NJQ99$N1F6A$N$h$&$G$9!#e(B

test_server_sessione$B$G%F%9%H$,;_$^$C$F$7$^$&$N$Oe(B
server_proce$B$NCf$Ne(Bwhen 1e$B$Ne(Bassert_equal(stats[:cache_hits],
1)e$B$Ne(B
Test::Unit::AssertionFailedErrore$B$,$&$^$/=hM}$G$-$F$$$J$$$+$i$Ne(B
e$B$h$&$G$9!#e(B

  1. Failure:
    test_client_session(OpenSSL::TestSSL)
    [/home/kazu/wc/ruby-lang/trunk/test/openssl/test_ssl.rb:438:in
    block (2 levels) in test_client_session' /home/kazu/wc/ruby-lang/trunk/test/openssl/test_ssl.rb:429:intimes’
    /home/kazu/wc/ruby-lang/trunk/test/openssl/test_ssl.rb:429:in
    block in test_client_session' /home/kazu/wc/ruby-lang/trunk/test/openssl/test_ssl.rb:129:incall’
    /home/kazu/wc/ruby-lang/trunk/test/openssl/test_ssl.rb:129:in
    start_server' /home/kazu/wc/ruby-lang/trunk/test/openssl/test_ssl.rb:428:intest_client_session’]:
    is not true.

  2. Failure:
    test_parallel(OpenSSL::TestSSL)
    [/home/kazu/wc/ruby-lang/trunk/test/openssl/test_ssl.rb:137:in
    start_server' /home/kazu/wc/ruby-lang/trunk/test/openssl/test_ssl.rb:287:intest_parallel’]:
    TCPServer was closed and SSLServer is still alive.

  3. Failure:
    test_read_and_write(OpenSSL::TestSSL)
    [/home/kazu/wc/ruby-lang/trunk/test/openssl/test_ssl.rb:137:in
    start_server' /home/kazu/wc/ruby-lang/trunk/test/openssl/test_ssl.rb:177:intest_read_and_write’]:
    TCPServer was closed and SSLServer is still alive.

  4. Failure:
    test_server_session(OpenSSL::TestSSL)
    [/home/kazu/wc/ruby-lang/trunk/test/openssl/test_ssl.rb:481:in
    block in test_server_session' /home/kazu/wc/ruby-lang/trunk/test/openssl/test_ssl.rb:86:incall’
    /home/kazu/wc/ruby-lang/trunk/test/openssl/test_ssl.rb:86:in `block
    (2 levels) in server_loop’]:
    <0> expected but was
    <1>.

  5. Failure:
    test_starttls(OpenSSL::TestSSL)
    [/home/kazu/wc/ruby-lang/trunk/test/openssl/test_ssl.rb:137:in
    start_server' /home/kazu/wc/ruby-lang/trunk/test/openssl/test_ssl.rb:263:intest_starttls’]:
    TCPServer was closed and SSLServer is still alive.

79 tests, 1144 assertions, 5 failures, 0 errors

At Sat, 31 May 2008 21:06:47 +0900,
akira yamada / やまだあきら wrote:

Nobuhiro IMAI さんは書きました:

Ruby 1.8.7-preview4 ですが、test-all の途中でエラーになります。既出で
しょうか?Debian GNU/Linux sid で、libssl-dev は 0.9.8g-10 です。ちな
みに、0.9.7e-3sarge5 な sarge の環境ではエラーになりませんでした。他に

0.9.8c-4etch3なetch環境ではパスします。

 手元のUbuntuç ‚å ´ã‚’8.04に更新すると 0.9.8g-4ubuntu3.1 という
バージョンになりましたが、テストは通るようです。

 現在の ruby_1_8_7 ブランチ先端と Debian sid 最新パッケージ
でも再現するのでしょうか。

Nobuhiro IMAI e$B$5$s$O=q$-$^$7$?e(B:

Ruby 1.8.7-preview4 e$B$G$9$,!"e(Btest-all e$B$NESCf$G%(%i!<$K$J$j$^$9!#4{=P$Ge(B
e$B$7$g$&$+!)e(BDebian GNU/Linux sid e$B$G!"e(Blibssl-dev e$B$Oe(B 0.9.8g-10 e$B$G$9!#$A$Je(B
e$B$_$K!"e(B0.9.7e-3sarge5 e$B$Je(B sarge e$B$N4D6-$G$O%(%i!<$K$J$j$^$;$s$G$7$?!#B>$Ke(B

0.9.8c-4etch3e$B$Je(Betche$B4D6-$G$O%Q%9$7$^$9!#e(B

e$B$3$NOCBj$K$D$$$F$$$m$$$m;n$7$F$$$F5$IU$$$?$N$G$9$,e(B
OpenSSL::SSL::SSLSocket.new(TCPSocket.new(“localhost”,80)).session
e$B$Ge(Bsegve$B$7$^$9!#e(B

Akinori MUSHA e$B$5$s$O=q$-$^$7$?e(B:

Ruby 1.8.7-preview4 e$B$G$9$,!"e(Btest-all e$B$NESCf$G%(%i!<$K$J$j$^$9!#4{=P$Ge(B
e$B$7$g$&$+!)e(BDebian GNU/Linux sid e$B$G!"e(Blibssl-dev e$B$Oe(B 0.9.8g-10 e$B$G$9!#$A$Je(B
e$B$_$K!"e(B0.9.7e-3sarge5 e$B$Je(B sarge e$B$N4D6-$G$O%(%i!<$K$J$j$^$;$s$G$7$?!#B>$Ke(B
0.9.8c-4etch3e$B$Je(Betche$B4D6-$G$O%Q%9$7$^$9!#e(B

e$B!!<j85$Ne(BUbuntue$B:=>l$re(B8.04e$B$K99?7$9$k$He(B 0.9.8g-4ubuntu3.1 e$B$H$$$&e(B
e$B%P!<%8%g%s$K$J$j$^$7$?$,!"%F%9%H$ODL$k$h$&$G$9!#e(B

e$B!!8=:_$Ne(B ruby_1_8_7 e$B%V%i%s%A@hC<$He(B Debian sid e$B:G?7%Q%C%1!<%8e(B
e$B$G$b:F8=$9$k$N$G$7$g$&$+!#e(B

e$B$O$$!":F8=$7$^$9!#e(B

0.9.8g-4ubuntu3.1e$B$r8+$F$_$?$N$G$9$,e(Btlsexte$B$,L58z$N$h$&$G$9e(B
(e$B$"$C$F$^$9$G$7$g$&$+e(B?)e$B!#e(B
Debiane$B$N$[$&$OM-8z$K$J$C$F$$$^$9!#e(B

(e$B0J2<!“30$7$F$$$kM=46$,$?$C$W$j$J$N$G$9$,!D!De(B)
tsharke$B$de(Bgdbe$B$G$J$,$a$?46$8$+$i!“e(B
e$B%;%C%7%g%s%A%1%C%H$,EO$C$F$$$J$/$Fe(B
e$B6&M-$9$Y$-%;%C%7%g%s$r8+IU$1$i$l$F$$$J$$$N$+$J$”$He(B
e$B;W$C$?$j$7$F$$$k$N$G$9$,!“e(B
e$B$=$N$”$?$jCN<1$,$J$/$F$h$/J,$+$j$^$;$s!#e(B
e$B$?$@!”$3$N$"$?$j$NF0:n$Oe(Btlsexte$B$K$h$k$h$&$G$O$"$j$^$9!#e(B

akira yamada / e$B$d$^$@$"$-$ie(B e$B$5$s$O=q$-$^$7$?e(B:

e$B!!8=:_$Ne(B ruby_1_8_7 e$B%V%i%s%A@hC<$He(B Debian sid e$B:G?7%Q%C%1!<%8e(B
e$B$G$b:F8=$9$k$N$G$7$g$&$+!#e(B

e$B$O$$!":F8=$7$^$9!#e(B

e$B0J2<$N$h$&$KJQ99$r2C$($k$H%F%9%H$r%Q%9$9$k$h$&$G$9!#e(B
(e$B:F$S30$7$F$$$k$+$b$7$l$^$;$s$,!#e(B)

— ext/openssl/ossl_ssl.c (revision 16835)
+++ ext/openssl/ossl_ssl.c (working copy)
@@ -1466,6 +1468,7 @@
ossl_ssl_def_const(OP_NO_SSLv2);
ossl_ssl_def_const(OP_NO_SSLv3);
ossl_ssl_def_const(OP_NO_TLSv1);

  • ossl_ssl_def_const(OP_NO_TICKET);
    ossl_ssl_def_const(OP_PKCS1_CHECK_1);
    ossl_ssl_def_const(OP_PKCS1_CHECK_2);
    ossl_ssl_def_const(OP_NETSCAPE_CA_DN_BUG);
    — test/openssl/test_ssl.rb (revision 16835)
    +++ test/openssl/test_ssl.rb (working copy)
    @@ -499,7 +499,9 @@
    start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true, :ctx_proc =>
    ctx_proc, :server_proc => server_proc) do |server, port|
    10.times do |i|
    sock = TCPSocket.new(“127.0.0.1”, port)
  •    ssl = OpenSSL::SSL::SSLSocket.new(sock)
    
  •   ctx = OpenSSL::SSL::SSLContext.new
    
  •   ctx.options = OpenSSL::SSL::OP_NO_TICKET
    
  •    ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
       ssl.sync_close = true
       ssl.session = first_session if first_session
       ssl.connect

At Thu, 5 Jun 2008 16:44:11 +0900,
akira yamada / やまだあきら wrote:

akira yamada / やまだあきら さんは書きました:

 現在の ruby_1_8_7 ブランチ先端と Debian sid 最新パッケージ
でも再現するのでしょうか。

はい、再現します。

ä»¥ä¸‹ã®ã‚ˆã†ã«å¤‰æ›´ã‚’åŠ ãˆã‚‹ã¨ãƒ†ã‚¹ãƒˆã‚’ãƒ‘ã‚¹ã™ã‚‹ã‚ˆã†ã§ã™ã€‚
(再び外しているかもしれませんが。)

 ありがとうございます。どこでも動くようにするならこうでしょうか。

Index: ext/openssl/ossl_ssl.c

— ext/openssl/ossl_ssl.c (revision 16821)
+++ ext/openssl/ossl_ssl.c (working copy)
@@ -1466,6 +1466,9 @@
ossl_ssl_def_const(OP_NO_SSLv2);
ossl_ssl_def_const(OP_NO_SSLv3);
ossl_ssl_def_const(OP_NO_TLSv1);
+#if defined(OP_NO_TICKET)

  • ossl_ssl_def_const(OP_NO_TICKET);
    +#endif
    ossl_ssl_def_const(OP_PKCS1_CHECK_1);
    ossl_ssl_def_const(OP_PKCS1_CHECK_2);
    ossl_ssl_def_const(OP_NETSCAPE_CA_DN_BUG);
    Index: test/openssl/test_ssl.rb
    ===================================================================
    — test/openssl/test_ssl.rb (revision 16821)
    +++ test/openssl/test_ssl.rb (working copy)
    @@ -499,7 +499,12 @@
    start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true, :ctx_proc =>
    ctx_proc, :server_proc => server_proc) do |server, port|
    10.times do |i|
    sock = TCPSocket.new(“127.0.0.1”, port)
  •    ssl = OpenSSL::SSL::SSLSocket.new(sock)
    
  •    ctx = OpenSSL::SSL::SSLContext.new
    
  •    if defined?(OpenSSL::SSL::OP_NO_TICKET)
    
  •      # disable RFC4507 support
    
  •      ctx.options = OpenSSL::SSL::OP_NO_TICKET
    
  •    end
    
  •    ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
       ssl.sync_close = true
       ssl.session = first_session if first_session
       ssl.connect
    

この話題についていろいろ試していて気付いたのですが
OpenSSL::SSL::SSLSocket.new(TCPSocket.new(“localhost”,80)).session
でsegvします。

 その状況を教えてください。OpenSSLの不具合なのか、それともRubyの
呼び出し方が不適切なせいなのかが気になります。

 後者ならば、SEGVするような呼び出し方をさせないworkaroundが必要と
思います。

At Thu, 5 Jun 2008 19:52:51 +0900,
akira yamada / やまだあきら wrote:

OpenSSL::SSL::Sessionのinitializeで
struct SSLをData_Get_Structしたとき、
SSLSocket#connectを呼び出す前だと
これはNULLなので…… ということかなと思っています。

とりあえず避けるだけなら↓でも避けられますが
struct SSLを初期化するべきなのかもしれません。

 SSLSocketã‚’æ¸¡ã—ãŸå ´åˆã¯ãã‚ŒãŒå†…åŒ…ã™ã‚‹sessionã‚’instantiateする
仕様に見えるので、修正を適用しました。

 あと、先のパッチも小ミスを修正して trunk, ruby_1_8 にcommit
しましたので確認をお願いします。

ã€€ã¾ãŸæƒ…å ±ãŒã‚ã‚Œã°ãŠçŸ¥ã‚‰ã›ãã ã•ã„ã€‚

Akinori MUSHA e$B$5$s$O=q$-$^$7$?e(B:

e$B$3$NOCBj$K$D$$$F$$$m$$$m;n$7$F$$$F5$IU$$$?$N$G$9$,e(B
OpenSSL::SSL::SSLSocket.new(TCPSocket.new(“localhost”,80)).session
e$B$Ge(Bsegve$B$7$^$9!#e(B

e$B!!$=$N>u67$r65$($F$/$@$5$$!#e(BOpenSSLe$B$NIT6q9g$J$N$+!"$=$l$H$be(BRubye$B$Ne(B
e$B8F$S=P$7J}$,ITE,@Z$J$;$$$J$N$+$,5$$K$J$j$^$9!#e(B

e$B!!8e<T$J$i$P!"e(BSEGVe$B$9$k$h$&$J8F$S=P$7J}$r$5$;$J$$e(Bworkarounde$B$,I,MW$He(B
e$B;W$$$^$9!#e(B

e$B<j85$G$Oe(B

$ 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

e$B$H$$$&46$8$K$J$j$^$9!#e(B

OpenSSL::SSL::Sessione$B$Ne(Binitializee$B$Ge(B
struct SSLe$B$re(BData_Get_Structe$B$7$?$H$-!"e(B
SSLSocket#connecte$B$r8F$S=P$9A0$@$He(B
e$B$3$l$Oe(BNULLe$B$J$N$G!D!De(B e$B$H$$$&$3$H$+$J$H;W$C$F$$$^$9!#e(B

e$B$H$j$"$($:Hr$1$k$@$1$J$i"-$G$bHr$1$i$l$^$9$,e(B
struct SSLe$B$r=i4|2=$9$k$Y$-$J$N$+$b$7$l$^$;$s!#e(B

— ext/openssl/ossl_ssl_session.c (e$B%j%S%8%g%se(B 16835)
+++ ext/openssl/ossl_ssl_session.c (e$B:n6H%3%T!<e(B)
@@ -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");