[ruby/psych] Ensure strings with only underscores are not processed as Integer

A string similar to "0x____" should be treated as a string.
Currently it is processed as an Integer.

This alters the regex specified by http://yaml.org/type/int.html
to ensure at least one numerical symbol is present in the string
before converting to Integer.

https://github.com/ruby/psych/commit/81479b203e
This commit is contained in:
John Meade 2024-09-09 15:22:14 +01:00 коммит произвёл git
Родитель 818e20359f
Коммит efc77d535b
2 изменённых файлов: 21 добавлений и 8 удалений

Просмотреть файл

@ -13,18 +13,18 @@ module Psych
# Base 60, [-+]inf and NaN are handled separately
FLOAT = /^(?:[-+]?([0-9][0-9_,]*)?\.[0-9]*([eE][-+][0-9]+)?(?# base 10))$/x
# Taken from http://yaml.org/type/int.html
INTEGER_STRICT = /^(?:[-+]?0b[0-1_]+ (?# base 2)
|[-+]?0[0-7_]+ (?# base 8)
|[-+]?(0|[1-9][0-9_]*) (?# base 10)
|[-+]?0x[0-9a-fA-F_]+ (?# base 16))$/x
# Taken from http://yaml.org/type/int.html and modified to ensure at least one numerical symbol exists
INTEGER_STRICT = /^(?:[-+]?0b[_]*[0-1][0-1_]* (?# base 2)
|[-+]?0[_]*[0-7][0-7_]* (?# base 8)
|[-+]?(0|[1-9][0-9_]*) (?# base 10)
|[-+]?0x[_]*[0-9a-fA-F][0-9a-fA-F_]* (?# base 16))$/x
# Same as above, but allows commas.
# Not to YML spec, but kept for backwards compatibility
INTEGER_LEGACY = /^(?:[-+]?0b[0-1_,]+ (?# base 2)
|[-+]?0[0-7_,]+ (?# base 8)
INTEGER_LEGACY = /^(?:[-+]?0b[_,]*[0-1][0-1_,]* (?# base 2)
|[-+]?0[_,]*[0-7][0-7_,]* (?# base 8)
|[-+]?(?:0|[1-9](?:[0-9]|,[0-9]|_[0-9])*) (?# base 10)
|[-+]?0x[0-9a-fA-F_,]+ (?# base 16))$/x
|[-+]?0x[_,]*[0-9a-fA-F][0-9a-fA-F_,]* (?# base 16))$/x
attr_reader :class_loader

Просмотреть файл

@ -126,6 +126,19 @@ module Psych
assert_equal '100_', ss.tokenize('100_')
end
def test_scan_strings_with_legacy_int_delimiters
assert_equal '0x_,_', ss.tokenize('0x_,_')
assert_equal '+0__,,', ss.tokenize('+0__,,')
assert_equal '-0b,_,', ss.tokenize('-0b,_,')
end
def test_scan_strings_with_strict_int_delimiters
scanner = Psych::ScalarScanner.new ClassLoader.new, strict_integer: true
assert_equal '0x___', scanner.tokenize('0x___')
assert_equal '+0____', scanner.tokenize('+0____')
assert_equal '-0b___', scanner.tokenize('-0b___')
end
def test_scan_int_commas_and_underscores
# NB: This test is to ensure backward compatibility with prior Psych versions,
# not to test against any actual YAML specification.