зеркало из https://github.com/go-gitea/yaml.git
Tighten restrictions on float decoding (#171)
ParseFloat() accepts strings that contain digits with a single 'e' character somewhere in the middle as valid floats. The YAML spec does not accept these. This causes problems especially when dealing with short commit hashes, e.g. `123456e1`
This commit is contained in:
Родитель
14227de293
Коммит
4c78c975fe
|
@ -581,6 +581,15 @@ var unmarshalTests = []struct {
|
||||||
"\xfe\xff\x00\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00 \xd8=\xdf\xd4\x00\n",
|
"\xfe\xff\x00\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00 \xd8=\xdf\xd4\x00\n",
|
||||||
M{"ñoño": "very yes 🟔"},
|
M{"ñoño": "very yes 🟔"},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// YAML Float regex shouldn't match this
|
||||||
|
{
|
||||||
|
"a: 123456e1\n",
|
||||||
|
M{"a": "123456e1"},
|
||||||
|
}, {
|
||||||
|
"a: 123456E1\n",
|
||||||
|
M{"a": "123456E1"},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
type M map[interface{}]interface{}
|
type M map[interface{}]interface{}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package yaml
|
||||||
import (
|
import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"math"
|
"math"
|
||||||
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
@ -80,6 +81,8 @@ func resolvableTag(tag string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var yamlStyleFloat = regexp.MustCompile(`^[-+]?[0-9]*\.?[0-9]+([eE][-+][0-9]+)?$`)
|
||||||
|
|
||||||
func resolve(tag string, in string) (rtag string, out interface{}) {
|
func resolve(tag string, in string) (rtag string, out interface{}) {
|
||||||
if !resolvableTag(tag) {
|
if !resolvableTag(tag) {
|
||||||
return tag, in
|
return tag, in
|
||||||
|
@ -135,10 +138,12 @@ func resolve(tag string, in string) (rtag string, out interface{}) {
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return yaml_INT_TAG, uintv
|
return yaml_INT_TAG, uintv
|
||||||
}
|
}
|
||||||
|
if yamlStyleFloat.MatchString(plain) {
|
||||||
floatv, err := strconv.ParseFloat(plain, 64)
|
floatv, err := strconv.ParseFloat(plain, 64)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return yaml_FLOAT_TAG, floatv
|
return yaml_FLOAT_TAG, floatv
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if strings.HasPrefix(plain, "0b") {
|
if strings.HasPrefix(plain, "0b") {
|
||||||
intv, err := strconv.ParseInt(plain[2:], 2, 64)
|
intv, err := strconv.ParseInt(plain[2:], 2, 64)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче