1
0
mirror of https://github.com/open-telemetry/opentelemetry-go.git synced 2026-06-03 18:35:08 +02:00

baggage: Fix Parse to validate member value before percent-decoding (#4755)

This commit is contained in:
Robert Pająk
2023-12-19 14:38:58 +01:00
committed by GitHub
parent 15f0ab964c
commit 43bd47de6e
4 changed files with 71 additions and 17 deletions
+10 -14
View File
@@ -254,11 +254,7 @@ func parseMember(member string) (Member, error) {
return newInvalidMember(), fmt.Errorf("%w: %d", errMemberBytes, n)
}
var (
key, value string
props properties
)
var props properties
keyValue, properties, found := strings.Cut(member, propertyDelimiter)
if found {
// Parse the member properties.
@@ -279,19 +275,19 @@ func parseMember(member string) (Member, error) {
}
// "Leading and trailing whitespaces are allowed but MUST be trimmed
// when converting the header into a data structure."
key = strings.TrimSpace(k)
var err error
value, err = url.PathUnescape(strings.TrimSpace(v))
if err != nil {
return newInvalidMember(), fmt.Errorf("%w: %q", err, value)
}
key := strings.TrimSpace(k)
if !validateKey(key) {
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidKey, key)
}
if !validateValue(value) {
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidValue, value)
}
val := strings.TrimSpace(v)
if !validateValue(val) {
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidValue, v)
}
value, err := url.PathUnescape(val)
if err != nil {
return newInvalidMember(), fmt.Errorf("%w: %v", errInvalidValue, err)
}
return Member{key: key, value: value, properties: props, hasData: true}, nil
}
+7 -2
View File
@@ -384,9 +384,9 @@ func TestBaggageParse(t *testing.T) {
},
{
name: "url encoded value",
in: "key1=val%252",
in: "key1=val%252%2C",
want: baggage.List{
"key1": {Value: "val%2"},
"key1": {Value: "val%2,"},
},
},
{
@@ -414,6 +414,11 @@ func TestBaggageParse(t *testing.T) {
in: "foo=\\",
err: errInvalidValue,
},
{
name: "invalid member: improper url encoded value",
in: "key1=val%",
err: errInvalidValue,
},
{
name: "invalid property: no key",
in: "foo=1;=v",