From 0ab3954dc410297eb5bef5817a33804084e4223a Mon Sep 17 00:00:00 2001 From: Lars Meyer Date: Fri, 4 Jun 2021 10:04:23 +0200 Subject: [PATCH] [process][linux] fix Processes in SmartOS lx containers In Linux containers running in LX Branded Zones on SmartOS (potentially other Solaris-based OSes with LX Branded Zones), fillFromTIDStatWithContext panics as the delayacct_blkio_ticks field is not present and thus results in an out-of-bounds slice access. Check the slice length before and only attempt to parse the delayacct_blkio_ticks field if there is an appropriate number of fields. --- process/process_linux.go | 11 ++++++++--- v3/process/process_linux.go | 11 ++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/process/process_linux.go b/process/process_linux.go index c9edf80..f5be514 100644 --- a/process/process_linux.go +++ b/process/process_linux.go @@ -1024,9 +1024,14 @@ func (p *Process) fillFromTIDStatWithContext(ctx context.Context, tid int32) (ui // There is no such thing as iotime in stat file. As an approximation, we // will use delayacct_blkio_ticks (aggregated block I/O delays, as per Linux // docs). Note: I am assuming at least Linux 2.6.18 - iotime, err := strconv.ParseFloat(fields[42], 64) - if err != nil { - iotime = 0 // Ancient linux version, most likely + var iotime float64 + if len(fields) > 42 { + iotime, err = strconv.ParseFloat(fields[42], 64) + if err != nil { + iotime = 0 // Ancient linux version, most likely + } + } else { + iotime = 0 // e.g. SmartOS containers } cpuTimes := &cpu.TimesStat{ diff --git a/v3/process/process_linux.go b/v3/process/process_linux.go index 302dc9f..910c597 100644 --- a/v3/process/process_linux.go +++ b/v3/process/process_linux.go @@ -1019,9 +1019,14 @@ func (p *Process) fillFromTIDStatWithContext(ctx context.Context, tid int32) (ui // There is no such thing as iotime in stat file. As an approximation, we // will use delayacct_blkio_ticks (aggregated block I/O delays, as per Linux // docs). Note: I am assuming at least Linux 2.6.18 - iotime, err := strconv.ParseFloat(fields[42], 64) - if err != nil { - iotime = 0 // Ancient linux version, most likely + var iotime float64 + if len(fields) > 42 { + iotime, err = strconv.ParseFloat(fields[42], 64) + if err != nil { + iotime = 0 // Ancient linux version, most likely + } + } else { + iotime = 0 // e.g. SmartOS containers } cpuTimes := &cpu.TimesStat{