summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2016-11-24 09:16:43 +0900
committerGitHub <[email protected]>2016-11-24 09:16:43 +0900
commit477e12c1821b5d6c845b5c80c7dd238bebc61f73 (patch)
treeb776724b2c8fd18545b9e89ff4532226af325684
parent2c28d00356c13f1c2bf4d2f6f5e8943c17fea518 (diff)
parent9bf1c0e1dc09d9aa577554d58d91f3889a77b918 (diff)
downloadmruby-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.c1
-rw-r--r--mrbgems/mruby-sprintf/test/sprintf.rb23
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