diff options
author | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-09-07 07:10:44 +0000 |
---|---|---|
committer | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-09-07 07:10:44 +0000 |
commit | 865ff7fb4f11bbf1f0e139e16470727828f54e63 (patch) | |
tree | 09e2f00bbd85e05ba96774c32f6ee3b6f543ae64 /ext/tk/lib | |
parent | a7357c196559f3181e359662d92cb06d7b18e3cb (diff) | |
download | ruby-865ff7fb4f11bbf1f0e139e16470727828f54e63.tar.gz |
* tcltklib.c (lib_mainloop_core): fixed signal-trap bug
* multi-tk.rb, tk.rb, tkafter.rb, tkcanvas.rb, tkfont.rb, tktext.rb,
tkvirtevent.rb : Ruby/Tk works at $SAFE == 4
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4527 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/tk/lib')
-rw-r--r-- | ext/tk/lib/multi-tk.rb | 51 | ||||
-rw-r--r-- | ext/tk/lib/tk.rb | 88 | ||||
-rw-r--r-- | ext/tk/lib/tkafter.rb | 4 | ||||
-rw-r--r-- | ext/tk/lib/tkcanvas.rb | 6 | ||||
-rw-r--r-- | ext/tk/lib/tkfont.rb | 2 | ||||
-rw-r--r-- | ext/tk/lib/tktext.rb | 4 | ||||
-rw-r--r-- | ext/tk/lib/tkvirtevent.rb | 2 |
7 files changed, 116 insertions, 41 deletions
diff --git a/ext/tk/lib/multi-tk.rb b/ext/tk/lib/multi-tk.rb index 12ed7aceff..7053dddef9 100644 --- a/ext/tk/lib/multi-tk.rb +++ b/ext/tk/lib/multi-tk.rb @@ -35,16 +35,16 @@ MultiTkIp_OK.freeze ################################################ # methods for construction class MultiTkIp - SLAVE_IP_ID = ['slave'.freeze, '0'].freeze + SLAVE_IP_ID = ['slave'.freeze, '0'.taint].freeze - @@IP_TABLE = {} + @@IP_TABLE = {}.taint - @@INIT_IP_ENV = [] # table of Procs - @@ADD_TK_PROCS = [] # table of [name, args, body] + @@INIT_IP_ENV = [].taint # table of Procs + @@ADD_TK_PROCS = [].taint # table of [name, args, body] - @@TK_TABLE_LIST = [] + @@TK_TABLE_LIST = [].taint - @@TK_CMD_TBL = {} + @@TK_CMD_TBL = {}.taint ###################################### @@ -64,7 +64,7 @@ class MultiTkIp rescue Exception end end - } + }.freeze ###################################### @@ -200,13 +200,13 @@ class MultiTkIp @@DEFAULT_MASTER = self.allocate @@DEFAULT_MASTER.instance_eval{ - @encoding = [] + @encoding = [].taint - @tk_windows = {} + @tk_windows = {}.taint - @tk_table_list = [] + @tk_table_list = [].taint - @slave_ip_tbl = {} + @slave_ip_tbl = {}.taint unless keys.kind_of? Hash fail ArgumentError, "expecting a Hash object for the 2nd argument" @@ -266,6 +266,7 @@ class MultiTkIp 'nested'.freeze, 'deleteHook'.freeze ].freeze + def _parse_slaveopts(keys) name = nil safe = false @@ -462,18 +463,24 @@ class MultiTkIp fail SecurityError, "slave-ip cannot create master-ip" end + if safeip == nil && $SAFE >= 4 + fail SecurityError, "cannot create master-ip at level #{$SAFE}" + end + unless keys.kind_of? Hash fail ArgumentError, "expecting a Hash object for the 2nd argument" end @encoding = [] - @tk_windows = {} - @tk_table_list = [] - @slave_ip_tbl = {} + @encoding.taint unless @encoding.tainted? + @tk_windows.taint unless @tk_windows.tainted? + @tk_table_list.taint unless @tk_table_list.tainted? + @slave_ip_tbl.taint unless @slave_ip_tbl.tainted? + name, safe, safe_opts, tk_opts = _parse_slaveopts(keys) if safeip == nil @@ -508,7 +515,10 @@ class MultiTkIp @@IP_TABLE[@threadgroup] = self _init_ip_internal(@@INIT_IP_ENV, @@ADD_TK_PROCS) - @@TK_TABLE_LIST.size.times{ @tk_table_list << {} } + @@TK_TABLE_LIST.size.times{ + (tbl = {}).tainted? || tbl.taint + @tk_table_list << tbl + } self.freeze # defend against modification end @@ -661,7 +671,10 @@ class MultiTkIp end def _add_new_tables - (@@TK_TABLE_LIST.size - @tk_table_list.size).times{ @tk_table_list << {} } + (@@TK_TABLE_LIST.size - @tk_table_list.size).times{ + (tbl = {}).tainted? || tbl.taint + @tk_table_list << tbl + } end def _init_ip_env(script) @@ -701,9 +714,9 @@ class MultiTkIp __getip._tk_table_list[id] end def self.create_table - if __getip.slave? - raise SecurityError, "slave-IP has no permission creating a new table" - end + #if __getip.slave? + # raise SecurityError, "slave-IP has no permission creating a new table" + #end id = @@TK_TABLE_LIST.size obj = Object.new @@TK_TABLE_LIST << obj diff --git a/ext/tk/lib/tk.rb b/ext/tk/lib/tk.rb index 6bd2736fe4..3dd3b3edb7 100644 --- a/ext/tk/lib/tk.rb +++ b/ext/tk/lib/tk.rb @@ -8,7 +8,7 @@ require "tcltklib" require "tkutil" module TkComm - WidgetClassNames = {} + WidgetClassNames = {}.taint None = Object.new def None.to_s @@ -18,7 +18,7 @@ module TkComm #Tk_CMDTBL = {} #Tk_WINDOWS = {} - Tk_IDs = ["00000", "00000"].freeze # [0]-cmdid, [1]-winid + Tk_IDs = ["00000".taint, "00000".taint].freeze # [0]-cmdid, [1]-winid # for backward compatibility Tk_CMDTBL = Object.new @@ -33,7 +33,7 @@ module TkComm Tk_WINDOWS.freeze self.instance_eval{ - @cmdtbl = [] + @cmdtbl = [].taint } def error_at @@ -332,6 +332,7 @@ module TkComm #Tk_CMDTBL[id] = cmd TkCore::INTERP.tk_cmd_tbl[id] = TkCore::INTERP.get_cb_entry(cmd) @cmdtbl = [] unless defined? @cmdtbl + @cmdtbl.taint unless @cmdtbl.tainted? @cmdtbl.push id return format("rb_out %s", id); end @@ -679,13 +680,13 @@ module TkCore end INTERP.instance_eval{ - @tk_cmd_tbl = {} - @tk_windows = {} + @tk_cmd_tbl = {}.taint + @tk_windows = {}.taint - @tk_table_list = [] + @tk_table_list = [].taint - @init_ip_env = [] # table of Procs - @add_tk_procs = [] # table of [name, args, body] + @init_ip_env = [].taint # table of Procs + @add_tk_procs = [].taint # table of [name, args, body] @cb_entry_class = Class.new{|c| def initialize(ip, cmd) @@ -711,7 +712,8 @@ module TkCore end def INTERP.create_table id = @tk_table_list.size - @tk_table_list << {} + (tbl = {}).tainted? || tbl.taint + @tk_table_list << tbl obj = Object.new obj.instance_eval <<-EOD def self.method_missing(m, *args) @@ -1636,7 +1638,7 @@ class TkBindTag #BTagID_TBL = {} BTagID_TBL = TkCore::INTERP.create_table - Tk_BINDTAG_ID = ["btag".freeze, "00000"].freeze + Tk_BINDTAG_ID = ["btag".freeze, "00000".taint].freeze TkCore::INTERP.init_ip_env{ BTagID_TBL.clear } @@ -1713,7 +1715,7 @@ class TkVariable #TkVar_ID_TBL = {} TkVar_CB_TBL = TkCore::INTERP.create_table TkVar_ID_TBL = TkCore::INTERP.create_table - Tk_VARIABLE_ID = ["v".freeze, "00000"].freeze + Tk_VARIABLE_ID = ["v".freeze, "00000".taint].freeze TkCore::INTERP.add_tk_procs('rb_var', 'args', "ruby [format \"TkVariable.callback %%Q!%s!\" $args]") @@ -3004,20 +3006,76 @@ module TkOptionDB end def add(pat, value, pri=None) + if $SAFE >= 4 + fail SecurityError, "can't call 'TkOptionDB.add' at $SAFE >= 4" + end tk_call 'option', 'add', pat, value, pri end def clear + if $SAFE >= 4 + fail SecurityError, "can't call 'TkOptionDB.crear' at $SAFE >= 4" + end tk_call 'option', 'clear' end def get(win, name, klass) - tk_call('option', 'get', win ,name, klass).taint + tk_call('option', 'get', win ,name, klass) end def readfile(file, pri=None) tk_call 'option', 'readfile', file, pri end module_function :add, :clear, :get, :readfile + + def read_entries(file, f_enc=nil) + if TkCore::INTERP.safe? + fail SecurityError, + "can't call 'TkOptionDB.read_entries' on a safe interpreter" + end + + i_enc = Tk.encoding() + + unless f_enc + f_enc = i_enc + end + + ent = [] + cline = '' + open(file, 'r') {|f| + while line = f.gets + cline += line.chomp! + case cline + when /\\$/ # continue + cline.chop! + next + when /^!/ # coment + cline = '' + next + when /^([^:]+):\s(.*)$/ + pat = $1 + val = $2 + p "ResourceDB: #{[pat, val].inspect}" if $DEBUG + pat = TkCore::INTERP._toUTF8(pat, f_enc) + pat = TkCore::INTERP._fromUTF8(pat, i_enc) + val = TkCore::INTERP._toUTF8(val, f_enc) + val = TkCore::INTERP._fromUTF8(val, i_enc) + ent << [pat, val] + cline = '' + else # unknown --> ignore + cline = '' + next + end + end + } + ent + end + module_function :read_entries def read_with_encoding(file, f_enc=nil, pri=None) + # try to read the file as an OptionDB file + readfile(file, pri).each{|pat, val| + add(pat, val, pri) + } + +=begin i_enc = Tk.encoding() unless f_enc @@ -3051,6 +3109,7 @@ module TkOptionDB end end } +=end end module_function :read_with_encoding @@ -4101,7 +4160,10 @@ class TkWindow<TkObject TkCore::INTERP.tk_windows.delete(path) } - tk_call 'destroy', epath + begin + tk_call 'destroy', epath + rescue + end uninstall_win end diff --git a/ext/tk/lib/tkafter.rb b/ext/tk/lib/tkafter.rb index 0572106771..239db4b5c9 100644 --- a/ext/tk/lib/tkafter.rb +++ b/ext/tk/lib/tkafter.rb @@ -11,8 +11,8 @@ class TkTimer TkCommandNames = ['after'.freeze].freeze - Tk_CBID = ['a'.freeze, '00000'].freeze - Tk_CBTBL = {} + Tk_CBID = ['a'.freeze, '00000'.taint].freeze + Tk_CBTBL = {}.taint TkCore::INTERP.add_tk_procs('rb_after', 'id', <<-'EOL') if {[set st [catch {ruby [format "TkTimer.callback %%Q!%s!" $id]} ret]] != 0} { diff --git a/ext/tk/lib/tkcanvas.rb b/ext/tk/lib/tkcanvas.rb index 024211aa1d..687f521655 100644 --- a/ext/tk/lib/tkcanvas.rb +++ b/ext/tk/lib/tkcanvas.rb @@ -557,7 +557,7 @@ class TkcTag<TkObject include TkcTagAccess CTagID_TBL = TkCore::INTERP.create_table - Tk_CanvasTag_ID = ['ctag'.freeze, '00000'].freeze + Tk_CanvasTag_ID = ['ctag'.freeze, '00000'.taint].freeze TkCore::INTERP.init_ip_env{ CTagID_TBL.clear } @@ -688,7 +688,7 @@ class TkcTagCurrent<TkcTag end class TkcGroup<TkcTag - Tk_cGroup_ID = ['tkcg'.freeze, '00000'].freeze + Tk_cGroup_ID = ['tkcg'.freeze, '00000'.taint].freeze def create_self(parent, *args) if not parent.kind_of?(TkCanvas) fail format("%s need to be TkCanvas", parent.inspect) @@ -851,7 +851,7 @@ class TkImage<TkObject TkCommandNames = ['image'.freeze].freeze Tk_IMGTBL = TkCore::INTERP.create_table - Tk_Image_ID = ['i'.freeze, '00000'].freeze + Tk_Image_ID = ['i'.freeze, '00000'.taint].freeze TkCore::INTERP.init_ip_env{ Tk_IMGTBL.clear } diff --git a/ext/tk/lib/tkfont.rb b/ext/tk/lib/tkfont.rb index be925dce7a..ff7bbc74e4 100644 --- a/ext/tk/lib/tkfont.rb +++ b/ext/tk/lib/tkfont.rb @@ -11,7 +11,7 @@ class TkFont TkCommandNames = ['font'.freeze].freeze - Tk_FontID = ["@font".freeze, "00000"].freeze + Tk_FontID = ["@font".freeze, "00000".taint].freeze Tk_FontNameTBL = TkCore::INTERP.create_table Tk_FontUseTBL = TkCore::INTERP.create_table diff --git a/ext/tk/lib/tktext.rb b/ext/tk/lib/tktext.rb index cf4fc68ddc..109afad924 100644 --- a/ext/tk/lib/tktext.rb +++ b/ext/tk/lib/tktext.rb @@ -807,7 +807,7 @@ class TkTextTag<TkObject include TkTreatTagFont TTagID_TBL = TkCore::INTERP.create_table - Tk_TextTag_ID = ['tag'.freeze, '00000'].freeze + Tk_TextTag_ID = ['tag'.freeze, '00000'.taint].freeze TkCore::INTERP.init_ip_env{ TTagID_TBL.clear } @@ -1023,7 +1023,7 @@ end class TkTextMark<TkObject TMarkID_TBL = TkCore::INTERP.create_table - Tk_TextMark_ID = ['mark'.freeze, '00000'].freeze + Tk_TextMark_ID = ['mark'.freeze, '00000'.taint].freeze TkCore::INTERP.init_ip_env{ TMarkID_TBL.clear } diff --git a/ext/tk/lib/tkvirtevent.rb b/ext/tk/lib/tkvirtevent.rb index 49c236f7f0..ccd3448434 100644 --- a/ext/tk/lib/tkvirtevent.rb +++ b/ext/tk/lib/tkvirtevent.rb @@ -9,7 +9,7 @@ class TkVirtualEvent<TkObject TkCommandNames = ['event'.freeze].freeze - TkVirtualEventID = ["<VirtEvent".freeze, "00000", ">".freeze].freeze + TkVirtualEventID = ["<VirtEvent".freeze, "00000".taint, ">".freeze].freeze TkVirtualEventTBL = TkCore::INTERP.create_table TkCore::INTERP.init_ip_env{ TkVirtualEventTBL.clear } |