Ruby コードを安全に実行する。
前にも書いたけど完全じゃないので。たぶん、これでいいはず。
def safe(lvl, tm=1)
result = nil
tg = nil
th = Thread.start(lvl) do |level|
tg = ThreadGroup.new.add(Thread.current)
$SAFE = level
result = yield
end.join(tm)
tg.list.each {|t| t.kill}
raise TimeoutError unless th
result
end
ThreadGroup を新しく作り、それにカレント実行スレッドを突っ込んで、信頼できないコードから生成されるスレッドを全てこいつの所属させ、実行終了したら kill! kill! kill!
IRC BOT の Ruby コード実行機能をこれにした。まぁしかし! SEGV されたら終りというどうしようもない脆弱性がありますけれども。
関連エントリー
- Ruby 時間制限付きでユーザコードを実行する。 IRC BOT に Ruby 式評価する機能でもと。 def safe(lvl, tm=1) result = nil Thread::st...
- VisualStudio.NET と Ruby を密に連携してエロエロするメモ 一昨日と昨日やったことのまとめ。rubyclr (なんか rubyclr のサイトって title 要素の内容がないんだけど) について。 ...
- PNG チャンク編集ツール 2Edit PNG iTXt chunk 結局自分で作ってみた。exerb で EXE 化しようと思ったら mswin32 版の Ruby では zlib が原因不明の SEGV で...
- Ruby, ブロック引数をとるメソッド def foo(a, b) yield a + b end def fop(a, b, &block) yield a + b end de...
- 中途半端さとバランス Ruby を中途半端に感じるのは、Ruby がいろんな言語のいいとこどりをしてバランスをたもとうとしてるからで、嫌な人は嫌なんだと思う。極端...