fixed crash on invalid map value in docker labels

This commit is contained in:
yusing 2024-11-11 06:17:23 +08:00
parent d936e24692
commit 2951304647

View file

@ -248,12 +248,18 @@ func Convert(src reflect.Value, dst reflect.Value) E.Error {
dst.Set(src.Convert(dstT)) dst.Set(src.Convert(dstT))
return nil return nil
case srcT.Kind() == reflect.Map: case srcT.Kind() == reflect.Map:
if src.Len() == 0 {
return nil
}
obj, ok := src.Interface().(SerializedObject) obj, ok := src.Interface().(SerializedObject)
if !ok { if !ok {
return ErrUnsupportedConversion.Subject(dstT.String() + " to " + srcT.String()) return ErrUnsupportedConversion.Subject(dstT.String() + " to " + srcT.String())
} }
return Deserialize(obj, dst.Addr().Interface()) return Deserialize(obj, dst.Addr().Interface())
case srcT.Kind() == reflect.Slice: case srcT.Kind() == reflect.Slice:
if src.Len() == 0 {
return nil
}
if dstT.Kind() != reflect.Slice { if dstT.Kind() != reflect.Slice {
return ErrUnsupportedConversion.Subject(dstT.String() + " to slice") return ErrUnsupportedConversion.Subject(dstT.String() + " to slice")
} }
@ -337,9 +343,13 @@ func ConvertString(src string, dst reflect.Value) (convertible bool, convErr E.E
return return
} }
// yaml like // yaml like
lines := strings.Split(strings.TrimSpace(src), "\n") lines := []string{}
for i := range lines { src = strings.TrimSpace(src)
lines[i] = strings.TrimSpace(lines[i]) if src != "" {
lines = strings.Split(src, "\n")
for i := range lines {
lines[i] = strings.TrimSpace(lines[i])
}
} }
var tmp any var tmp any
switch dst.Kind() { switch dst.Kind() {
@ -367,9 +377,11 @@ func ConvertString(src string, dst reflect.Value) (convertible bool, convErr E.E
parts := strings.Split(line, ":") parts := strings.Split(line, ":")
if len(parts) < 2 { if len(parts) < 2 {
errs.Add(ErrMapMissingColon.Subjectf("line %d", i+1)) errs.Add(ErrMapMissingColon.Subjectf("line %d", i+1))
continue
} }
if len(parts) > 2 { if len(parts) > 2 {
errs.Add(ErrMapTooManyColons.Subjectf("line %d", i+1)) errs.Add(ErrMapTooManyColons.Subjectf("line %d", i+1))
continue
} }
k := strings.TrimSpace(parts[0]) k := strings.TrimSpace(parts[0])
v := strings.TrimSpace(parts[1]) v := strings.TrimSpace(parts[1])