diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c index 99bd9f06..49a340c4 100644 --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -2845,6 +2845,7 @@ rb_cstr_convert_to_BigDecimal(const char *c_str, int raise_exception) static inline VALUE rb_str_convert_to_BigDecimal(VALUE val, int raise_exception) { + if (!raise_exception && memchr(RSTRING_PTR(val), '\0', RSTRING_LEN(val))) return Qnil; const char *c_str = StringValueCStr(val); return rb_cstr_convert_to_BigDecimal(c_str, raise_exception); } diff --git a/test/bigdecimal/test_bigdecimal.rb b/test/bigdecimal/test_bigdecimal.rb index 4487f4a4..b956b225 100644 --- a/test/bigdecimal/test_bigdecimal.rb +++ b/test/bigdecimal/test_bigdecimal.rb @@ -275,6 +275,12 @@ def test_BigDecimal_with_exception_keyword assert_nothing_raised(ArgumentError) { assert_equal(nil, BigDecimal(".", exception: false)) } + assert_raise(ArgumentError) { + BigDecimal("1\0", exception: true) + } + assert_nothing_raised(ArgumentError) { + assert_equal(nil, BigDecimal("1\0", exception: false)) + } assert_raise(ArgumentError) { BigDecimal("1", -1, exception: true) }