From: Takao Kouji Date: 2008-08-03T14:11:25+09:00 Subject: [ruby-dev:35743] Re: $SAFE=4の場合のReadline::HISTORY.each 高尾宏治です。 On 2008/08/03, at 1:38, Kazuhiro NISHIYAMA wrote: > At Sat, 2 Aug 2008 00:50:00 +0900, > Takao Kouji wrote: >> なお、現在、$SAFE が 4 の場合に >> each メソッドをブロックなしで呼び出すことはできますが、 >> 返り値の Enumerable::Enumerator に対してメソッド呼び出しをすると、 >> 例外 SecurityError が発生します。 >> このため、例外が発生するタイミングが遅いというだけで、 >> 実害はないと考えています。 >> >> 以下の例では、パッチ適用後は(1)で例外が発生し、 >> パッチ適用前は(2)で例外が発生します。 >> >> require "readline" >> Readline::HISTORY.push("a", "b", "c") >> $SAFE = 4 >> e = Readline::HISTORY.each # (1) >> e.each do |s| # (2) >> p s >> end > > require "readline" > Readline::HISTORY.push("a", "b", "c") > e = nil > proc { > $SAFE = 4 > e = Readline::HISTORY.each # (1) > }.call > e.each do |s| # (2) > p s > end > > のような場合の挙動が変わりそうです。 ご指摘の通りですね。 パッチ適用前は、西山さんの例ではヒストリの履歴を取得できてしまいますね。 元々の前田さんが書かれた Readline::HISTORY.each メソッドでは、 $SAFE=4 であれば例外 SecurityError を発生させることを 意図されていたのではないかと思います。 knu さんが Enumerable::Enumerator を返すように修正されたときに 挙動が変わったと考えられます。 つまり、西山さんの例で、 ヒストリの履歴を取得できることはバグの可能性があります。 私の修正により、元々の Readline::HISTORY.each メソッドの $SAFE=4 のときの想定通りになると考えています。