From cc61f0dcb9e174610ec9be36c9cfa71bc16dac42 Mon Sep 17 00:00:00 2001 From: Konstantin Demin Date: Wed, 2 Nov 2022 23:14:07 +0300 Subject: [PATCH] cgroups: accurate procfs parsing fixes #6389 Signed-off-by: Konstantin Demin --- .chloggen/cgroup-subsys-line-parse.yaml | 7 +++++++ internal/cgroups/subsys.go | 2 +- internal/cgroups/subsys_test.go | 17 ++++++++++------- 3 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 .chloggen/cgroup-subsys-line-parse.yaml diff --git a/.chloggen/cgroup-subsys-line-parse.yaml b/.chloggen/cgroup-subsys-line-parse.yaml new file mode 100644 index 00000000000..c637017d950 --- /dev/null +++ b/.chloggen/cgroup-subsys-line-parse.yaml @@ -0,0 +1,7 @@ +change_type: bug_fix + +component: cgroups + +note: split line into exactly 3 parts while parsing /proc/{pid}/cgroup + +issues: [6389] diff --git a/internal/cgroups/subsys.go b/internal/cgroups/subsys.go index 40d453ad377..b4a529056c3 100644 --- a/internal/cgroups/subsys.go +++ b/internal/cgroups/subsys.go @@ -70,7 +70,7 @@ type CGroupSubsys struct { // NewCGroupSubsysFromLine returns a new *CGroupSubsys by parsing a string in // the format of `/proc/$PID/cgroup` func NewCGroupSubsysFromLine(line string) (*CGroupSubsys, error) { - fields := strings.Split(line, _cgroupSep) + fields := strings.SplitN(line, _cgroupSep, _csFieldCount) if len(fields) != _csFieldCount { return nil, cgroupSubsysFormatInvalidError{line} diff --git a/internal/cgroups/subsys_test.go b/internal/cgroups/subsys_test.go index bf496ffb21a..c75db358e9e 100644 --- a/internal/cgroups/subsys_test.go +++ b/internal/cgroups/subsys_test.go @@ -70,6 +70,15 @@ func TestNewCGroupSubsysFromLine(t *testing.T) { Name: "/docker/1234567890abcdef", }, }, + { + name: "sophisticated-path", + line: "4:pids:/example.slice:extra-path-designator", + expectedSubsys: &CGroupSubsys{ + ID: 4, + Subsystems: []string{"pids"}, + Name: "/example.slice:extra-path-designator", + }, + }, } for _, tt := range testTable { @@ -82,7 +91,6 @@ func TestNewCGroupSubsysFromLine(t *testing.T) { func TestNewCGroupSubsysFromLineErr(t *testing.T) { lines := []string{ "1:cpu", - "1:cpu,cpuacct:/:/necessary-field", "not-a-number:cpu:/", } _, parseError := strconv.Atoi("not-a-number") @@ -97,14 +105,9 @@ func TestNewCGroupSubsysFromLineErr(t *testing.T) { line: lines[0], expectedError: cgroupSubsysFormatInvalidError{lines[0]}, }, - { - name: "more-fields", - line: lines[1], - expectedError: cgroupSubsysFormatInvalidError{lines[1]}, - }, { name: "illegal-id", - line: lines[2], + line: lines[1], expectedError: parseError, }, }