Skip to content

Commit

Permalink
Check capname of tigetstr/tigetflag/tigetnum
Browse files Browse the repository at this point in the history
Incorrect arguments can cause SEGV.
  • Loading branch information
aycabta committed Jan 2, 2022
1 parent 1ca7797 commit a58748b
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 0 deletions.
3 changes: 3 additions & 0 deletions lib/reline/terminfo.rb
Expand Up @@ -121,6 +121,7 @@ def tiparm(*args) # for method chain
end

def self.tigetstr(capname)
raise TerminfoError, "capname is not String: #{capname.inspect}" unless capname.is_a?(String)
capability = @tigetstr.(capname)
case capability.to_i
when 0, -1
Expand All @@ -138,6 +139,7 @@ def self.tiparm(str, *args)
end

def self.tigetflag(capname)
raise TerminfoError, "capname is not String: #{capname.inspect}" unless capname.is_a?(String)
flag = @tigetflag.(capname).to_i
case flag
when -1
Expand All @@ -149,6 +151,7 @@ def self.tigetflag(capname)
end

def self.tigetnum(capname)
raise TerminfoError, "capname is not String: #{capname.inspect}" unless capname.is_a?(String)
num = @tigetnum.(capname).to_i
case num
when -2
Expand Down
3 changes: 3 additions & 0 deletions test/reline/test_terminfo.rb
Expand Up @@ -14,6 +14,7 @@ def test_tigetstr

def test_tigetstr_with_error
assert_raise(Reline::Terminfo::TerminfoError) { Reline::Terminfo.tigetstr('unknown') }
assert_raise(Reline::Terminfo::TerminfoError) { Reline::Terminfo.tigetstr(nil) }
end

def test_tiparm
Expand Down Expand Up @@ -43,6 +44,7 @@ def test_tigetflag
def test_tigetflag_with_error
assert_raise(Reline::Terminfo::TerminfoError) { Reline::Terminfo.tigetflag('cuu') }
assert_raise(Reline::Terminfo::TerminfoError) { Reline::Terminfo.tigetflag('unknown') }
assert_raise(Reline::Terminfo::TerminfoError) { Reline::Terminfo.tigetflag(nil) }
end

def test_tigetnum
Expand All @@ -54,5 +56,6 @@ def test_tigetnum
def test_tigetnum_with_error
assert_raise(Reline::Terminfo::TerminfoError) { Reline::Terminfo.tigetnum('cuu') }
assert_raise(Reline::Terminfo::TerminfoError) { Reline::Terminfo.tigetnum('unknown') }
assert_raise(Reline::Terminfo::TerminfoError) { Reline::Terminfo.tigetnum(nil) }
end
end if Reline::Terminfo.enabled?

0 comments on commit a58748b

Please sign in to comment.