From: Yukihiro Matsumoto Date: 2004-12-14T00:38:19+09:00 Subject: [ruby-dev:25188] Re: OpenSSL::Digest::Digest.new dumps core まつもと ゆきひろです In message "Re: [ruby-dev:25187] OpenSSL::Digest::Digest.new dumps core" on Tue, 14 Dec 2004 00:00:00 +0900, Tanaka Akira writes: |次のようにすると core を吐きます。 | |% ./ruby -ropenssl -e 'OpenSSL::Digest::Digest.new("a" * 0x20000)' |-e:1: [BUG] Segmentation fault |ruby 1.9.0 (2004-12-13) [i686-linux] ossl.cの286行目でvsnprintf()の戻り値をチェックしていないから 結局buffer overflowを起こしてますね。linux manによれば 返り値 成 功時には、上記の関数は書き込まれた文字の個数を返す (文字列の最後を示 すために使用する`\0'は含まれない)。 snprintf と vsnprintf は、(文字列の 終端にある'\0'を含めて) size バイトを越える文字数を書き込まない。この制 限によって出力が中断された場合にはもし利用可能な十分なスペースがあれ ば 書 き 込まれたであろう文字の個数 (文字列の終端にある'\0'を除く)を返す。 従って、返り値が size 以上だった場合、出力が中断されたことを意味する ( 後述の注意も参照のこと)。エラーが発生した場合は、負の数を返す。 注意 glibc の snprintf と vsnprintf の実装は、glibc バージョン 2.1 以 降 は C99 標準に準拠している。つまり、上述のとおりに振舞う。 glibc 2.0.6 まで は、出力が中断された場合は -1 を返す。 だそうですから。修正はゆうぞうさんに任せたいなあ。