Skip to content

Commit b54a4b3

Browse files
byrootjhawthorn
authored andcommitted
Improve performance of NumberToDelimitedConverter
[CVE-2026-33169] [GHSA-cg4j-q9v8-6v38]
1 parent c1ad0e8 commit b54a4b3

2 files changed

Lines changed: 19 additions & 2 deletions

File tree

activesupport/lib/active_support/number_helper/number_to_delimited_converter.rb

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,24 @@ def convert
1616
private
1717
def parts
1818
left, right = number.to_s.split(".")
19-
left.gsub!(delimiter_pattern) do |digit_to_delimit|
20-
"#{digit_to_delimit}#{options[:delimiter]}"
19+
if delimiter_pattern
20+
left.gsub!(delimiter_pattern) do |digit_to_delimit|
21+
"#{digit_to_delimit}#{options[:delimiter]}"
22+
end
23+
else
24+
left_parts = []
25+
offset = left.size % 3
26+
if offset > 0
27+
left_parts << left[0, offset]
28+
end
29+
30+
(left.size / 3).times do |i|
31+
left_parts << left[offset + (i * 3), 3]
32+
end
33+
34+
left = left_parts.join(options[:delimiter])
2135
end
36+
2237
[left, right].compact
2338
end
2439

activesupport/test/number_helper_test.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ def test_to_delimited
139139
assert_equal("12,345,678", number_helper.number_to_delimited(12345678))
140140
assert_equal("0", number_helper.number_to_delimited(0))
141141
assert_equal("123", number_helper.number_to_delimited(123))
142+
assert_equal("1,234", number_helper.number_to_delimited(1234))
143+
assert_equal("12,345", number_helper.number_to_delimited(12345))
142144
assert_equal("123,456", number_helper.number_to_delimited(123456))
143145
assert_equal("123,456.78", number_helper.number_to_delimited(123456.78))
144146
assert_equal("123,456.789", number_helper.number_to_delimited(123456.789))

0 commit comments

Comments
 (0)