summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--sprintf.c5
-rw-r--r--test/ruby/test_sprintf.rb4
3 files changed, 14 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 94ca67d163..7aa6f8d1c3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Jun 27 03:41:53 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * sprintf.c (GETASTER): should not use the numbered argument to be
+ formatted, raise ArgumentError instead.
+ [ruby-dev:48330] [Bug #9982]
+
Thu Jun 26 18:18:28 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
* test/with_different_ofs.rb: move into test library directory.
diff --git a/sprintf.c b/sprintf.c
index 9a08764448..56671de731 100644
--- a/sprintf.c
+++ b/sprintf.c
@@ -79,6 +79,9 @@ sign_bits(int base, const char *p)
} while (0)
#define GETARG() (nextvalue != Qundef ? nextvalue : \
+ GETNEXTARG())
+
+#define GETNEXTARG() ( \
posarg == -1 ? \
(rb_raise(rb_eArgError, "unnumbered(%d) mixed with numbered", nextarg), 0) : \
posarg == -2 ? \
@@ -125,7 +128,7 @@ sign_bits(int base, const char *p)
tmp = GETPOSARG(n); \
} \
else { \
- tmp = GETARG(); \
+ tmp = GETNEXTARG(); \
p = t; \
} \
(val) = NUM2INT(tmp); \
diff --git a/test/ruby/test_sprintf.rb b/test/ruby/test_sprintf.rb
index 2a0fc487c1..7994e99e5e 100644
--- a/test/ruby/test_sprintf.rb
+++ b/test/ruby/test_sprintf.rb
@@ -184,6 +184,10 @@ class TestSprintf < Test::Unit::TestCase
assert_raise(ArgumentError) { sprintf("%!", 1) }
assert_raise(ArgumentError) { sprintf("%1$1$d", 1) }
assert_raise(ArgumentError) { sprintf("%0%") }
+
+ assert_raise_with_message(ArgumentError, /unnumbered\(1\) mixed with numbered/) { sprintf("%1$*d", 3) }
+ assert_raise_with_message(ArgumentError, /unnumbered\(1\) mixed with numbered/) { sprintf("%1$.*d", 3) }
+
verbose, $VERBOSE = $VERBOSE, nil
assert_nothing_raised { sprintf("", 1) }
ensure