diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-11-24 09:16:43 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2016-11-24 09:16:43 +0900 |
| commit | 477e12c1821b5d6c845b5c80c7dd238bebc61f73 (patch) | |
| tree | b776724b2c8fd18545b9e89ff4532226af325684 | |
| parent | 2c28d00356c13f1c2bf4d2f6f5e8943c17fea518 (diff) | |
| parent | 9bf1c0e1dc09d9aa577554d58d91f3889a77b918 (diff) | |
| download | mruby-477e12c1821b5d6c845b5c80c7dd238bebc61f73.tar.gz mruby-477e12c1821b5d6c845b5c80c7dd238bebc61f73.zip | |
Merge pull request #3269 from bouk/fix-printf-segfault
Fix segfault when Fixnum#chr doesn't return a string
| -rw-r--r-- | mrbgems/mruby-sprintf/src/sprintf.c | 1 | ||||
| -rw-r--r-- | mrbgems/mruby-sprintf/test/sprintf.rb | 23 |
2 files changed, 24 insertions, 0 deletions
diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c index 8d14b0fc5..ccee23bd2 100644 --- a/mrbgems/mruby-sprintf/src/sprintf.c +++ b/mrbgems/mruby-sprintf/src/sprintf.c @@ -675,6 +675,7 @@ retry: else { mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid character"); } + mrb_check_type(mrb, tmp, MRB_TT_STRING); c = RSTRING_PTR(tmp); n = RSTRING_LEN(tmp); if (!(flags & FWIDTH)) { diff --git a/mrbgems/mruby-sprintf/test/sprintf.rb b/mrbgems/mruby-sprintf/test/sprintf.rb index 478581a49..ccbd95d51 100644 --- a/mrbgems/mruby-sprintf/test/sprintf.rb +++ b/mrbgems/mruby-sprintf/test/sprintf.rb @@ -7,3 +7,26 @@ assert('String#%') do assert_equal "123 < 456", "%{num} < %<str>s" % { num: 123, str: "456" } assert_equal 15, ("%b" % (1<<14)).size end + +assert("String#% with invalid chr") do + begin + class Fixnum + alias_method :chr_, :chr if method_defined?(:chr) + + def chr + nil + end + end + + assert_raise TypeError do + "%c" % 0 + end + ensure + class Fixnum + if method_defined?(:chr_) + alias_method :chr, :chr_ + remove_method :chr_ + end + end + end +end |
