前にも書いたけど完全じゃないので。たぶん、これでいいはず。
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 されたら終りというどうしようもない脆弱性がありますけれども。