mirror of
https://github.com/opencontainers/runc.git
synced 2026-07-11 06:03:57 +08:00
Merge pull request #5161 from kolyshkin/1.4-5133
[1.4] libct/specconv: fix panic in initSystemdProps
This commit is contained in:
@@ -758,7 +758,7 @@ func initSystemdProps(spec *specs.Spec) ([]systemdDbus.Property, error) {
|
|||||||
return nil, fmt.Errorf("annotation %s=%s value parse error: %w", k, v, err)
|
return nil, fmt.Errorf("annotation %s=%s value parse error: %w", k, v, err)
|
||||||
}
|
}
|
||||||
// Check for Sec suffix.
|
// Check for Sec suffix.
|
||||||
if trimName := strings.TrimSuffix(name, "Sec"); len(trimName) < len(name) {
|
if trimName, ok := strings.CutSuffix(name, "Sec"); ok && len(trimName) > 0 {
|
||||||
// Check for a lowercase ascii a-z just before Sec.
|
// Check for a lowercase ascii a-z just before Sec.
|
||||||
if ch := trimName[len(trimName)-1]; ch >= 'a' && ch <= 'z' {
|
if ch := trimName[len(trimName)-1]; ch >= 'a' && ch <= 'z' {
|
||||||
// Convert from Sec to USec.
|
// Convert from Sec to USec.
|
||||||
|
|||||||
@@ -685,8 +685,9 @@ func TestInitSystemdProps(t *testing.T) {
|
|||||||
exp expT
|
exp expT
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
in: inT{"org.systemd.property.TimeoutStopUSec", "uint64 123456789"},
|
desc: "convert USec to Sec (simple case)",
|
||||||
exp: expT{false, "TimeoutStopUSec", uint64(123456789)},
|
in: inT{"org.systemd.property.TimeoutStopUSec", "uint64 123456789"},
|
||||||
|
exp: expT{false, "TimeoutStopUSec", uint64(123456789)},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
desc: "convert USec to Sec (default numeric type)",
|
desc: "convert USec to Sec (default numeric type)",
|
||||||
@@ -749,8 +750,14 @@ func TestInitSystemdProps(t *testing.T) {
|
|||||||
exp: expT{false, "FOOSec", 123},
|
exp: expT{false, "FOOSec", 123},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
in: inT{"org.systemd.property.CollectMode", "'inactive-or-failed'"},
|
desc: "convert USec to Sec (short name)",
|
||||||
exp: expT{false, "CollectMode", "inactive-or-failed"},
|
in: inT{"org.systemd.property.Sec", "123"},
|
||||||
|
exp: expT{false, "Sec", 123},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "CollectMode",
|
||||||
|
in: inT{"org.systemd.property.CollectMode", "'inactive-or-failed'"},
|
||||||
|
exp: expT{false, "CollectMode", "inactive-or-failed"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
desc: "unrelated property",
|
desc: "unrelated property",
|
||||||
@@ -777,33 +784,35 @@ func TestInitSystemdProps(t *testing.T) {
|
|||||||
spec := &specs.Spec{}
|
spec := &specs.Spec{}
|
||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
spec.Annotations = map[string]string{tc.in.name: tc.in.value}
|
t.Run(tc.desc, func(t *testing.T) {
|
||||||
|
spec.Annotations = map[string]string{tc.in.name: tc.in.value}
|
||||||
|
|
||||||
outMap, err := initSystemdProps(spec)
|
outMap, err := initSystemdProps(spec)
|
||||||
// t.Logf("input %+v, expected %+v, got err:%v out:%+v", tc.in, tc.exp, err, outMap)
|
// t.Logf("input %+v, expected %+v, got err:%v out:%+v", tc.in, tc.exp, err, outMap)
|
||||||
|
|
||||||
if tc.exp.isErr != (err != nil) {
|
if tc.exp.isErr != (err != nil) {
|
||||||
t.Errorf("input %+v, expecting error: %v, got %v", tc.in, tc.exp.isErr, err)
|
t.Errorf("input %+v, expecting error: %v, got %v", tc.in, tc.exp.isErr, err)
|
||||||
}
|
}
|
||||||
expLen := 1 // expect a single item
|
expLen := 1 // expect a single item
|
||||||
if tc.exp.name == "" {
|
if tc.exp.name == "" {
|
||||||
expLen = 0 // expect nothing
|
expLen = 0 // expect nothing
|
||||||
}
|
}
|
||||||
if len(outMap) != expLen {
|
if len(outMap) != expLen {
|
||||||
t.Fatalf("input %+v, expected %d, got %d entries: %v", tc.in, expLen, len(outMap), outMap)
|
t.Fatalf("input %+v, expected %d, got %d entries: %v", tc.in, expLen, len(outMap), outMap)
|
||||||
}
|
}
|
||||||
if expLen == 0 {
|
if expLen == 0 {
|
||||||
continue
|
return // No more checks.
|
||||||
}
|
}
|
||||||
|
|
||||||
out := outMap[0]
|
out := outMap[0]
|
||||||
if tc.exp.name != out.Name {
|
if tc.exp.name != out.Name {
|
||||||
t.Errorf("input %+v, expecting name: %q, got %q", tc.in, tc.exp.name, out.Name)
|
t.Errorf("input %+v, expecting name: %q, got %q", tc.in, tc.exp.name, out.Name)
|
||||||
}
|
}
|
||||||
expValue := dbus.MakeVariant(tc.exp.value).String()
|
expValue := dbus.MakeVariant(tc.exp.value).String()
|
||||||
if expValue != out.Value.String() {
|
if expValue != out.Value.String() {
|
||||||
t.Errorf("input %+v, expecting value: %s, got %s", tc.in, expValue, out.Value)
|
t.Errorf("input %+v, expecting value: %s, got %s", tc.in, expValue, out.Value)
|
||||||
}
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user