Bug #4416

OpenSSL::SSL::Session#session_new_cb

Added by Ippei Obayashi about 3 years ago. Updated almost 3 years ago.

[ruby-dev:43233]
Status:Closed
Priority:Normal
Assignee:Hiroshi Nakamura
Category:ext
Target version:1.9.3
ruby -v:ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux] Backport:

Description

=begin
SSLCTXsesssetnewcb で渡すコールバックの返り値は、
「0 を返すと新しく作られた SSL
SESSION のリファレンスカウンタの
値を減らし(て SSL_SESSION を解放し)、
それ以外を返すとリファレンスカウンタを減らさない」となっています。

しかし、ext/openssl/osslssl.c:osslsslctxsessionnew_cb ではその中で
リファレンスカウンタの値を増やしているにもかかわらず1を返す場合があります。

ここは常に0を返すべきではないでしょうか?
=end

Associated revisions

Revision 32204
Added by Hiroshi Nakamura almost 3 years ago

  • ext/openssl/osslssl.c (osslsslctxsessionnewcb): Return 0 to
    OpenSSL from the callback for SSL
    CTXsesssetgetcb().
    Returning 0 means to OpenSSL that the the session is still valid
    (since we created Ruby Session object) and was not freed by us with
    SSLSESSIONfree(). Call SSLContext#removesession(sess) in
    session
    get_cb block if you don't want OpenSSL to cache the session
    internally.
    This potential issue was pointed by Ippei Obayashi. See #4416.

  • test/openssl/testsslsession.rb (testctxserversessioncb): Test
    it.

History

#1 Updated by Yui NARUSE about 3 years ago

  • Status changed from Open to Assigned
  • Assignee set to Hiroshi Nakamura

=begin

=end

#2 Updated by Hiroshi Nakamura almost 3 years ago

この参照追加はRubyオブジェクトからの参照で、Rubyオブジェクトの開放時にSSLSESSIONfreeを呼ぶために必要なんですが、逆に0(Rubyレベルでfalse)を返したときのOpenSSLの挙動がよくわかりませんね。。。うーむ。

#3 Updated by Hiroshi Nakamura almost 3 years ago

  • Status changed from Assigned to Closed
  • Target version changed from 1.9.2 to 1.9.3

r32204で、ご提案いただいたとおりの修正を入れました。Rubyオブジェクトからの参照があり、OpenSSLに何を返しても、sessionnewcbに渡されたセッションはクリアされないのですから、0や1を返し分けても無意味、なので、OpenSSL側での整合性を取るために、常に0を返して参照数を適切に調整すべき、ということですね。やっと理解しました。ありがとうございました。

結果として、sessionnewcbのコールバックについて、「返す値に意味はない」という変更になりましたが、もとよりバグですので、修正として扱おうと思います。ドキュメントに影響が出てしまい恐縮です。

Also available in: Atom PDF