From a58748bcf96c24bd15f8b583a4f38fd63cd6ff42 Mon Sep 17 00:00:00 2001 From: aycabta Date: Sun, 2 Jan 2022 11:44:45 +0900 Subject: [PATCH] Check capname of tigetstr/tigetflag/tigetnum Incorrect arguments can cause SEGV. --- lib/reline/terminfo.rb | 3 +++ test/reline/test_terminfo.rb | 3 +++ 2 files changed, 6 insertions(+) diff --git a/lib/reline/terminfo.rb b/lib/reline/terminfo.rb index 95ff082172..b053ba82c4 100644 --- a/lib/reline/terminfo.rb +++ b/lib/reline/terminfo.rb @@ -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 @@ -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 @@ -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 diff --git a/test/reline/test_terminfo.rb b/test/reline/test_terminfo.rb index b969da1397..dda9b32495 100644 --- a/test/reline/test_terminfo.rb +++ b/test/reline/test_terminfo.rb @@ -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 @@ -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 @@ -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?