From 149481a57184becf3e9be329d253602654414118 Mon Sep 17 00:00:00 2001 From: haircommander Date: Mon, 20 Aug 2018 18:24:35 -0400 Subject: Fixed segfault in stats where container had netNS none or from container Signed-off-by: haircommander Closes: #1306 Approved by: rhatdan --- libpod/networking_linux.go | 28 +++++++++++++++++++++++++++- libpod/stats.go | 10 ++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) (limited to 'libpod') diff --git a/libpod/networking_linux.go b/libpod/networking_linux.go index e5f935e30..77ab97910 100644 --- a/libpod/networking_linux.go +++ b/libpod/networking_linux.go @@ -249,9 +249,35 @@ func (r *Runtime) teardownNetNS(ctr *Container) error { return nil } +func getContainerNetNS(ctr *Container) (string, error) { + if ctr.state.NetNS != nil { + return ctr.state.NetNS.Path(), nil + } + if ctr.config.NetNsCtr != "" { + c, err := ctr.runtime.GetContainer(ctr.config.NetNsCtr) + if err != nil { + return "", err + } + if err = c.syncContainer(); err != nil { + return "", err + } + return c.state.NetNS.Path(), nil + } + return "", nil +} + func getContainerNetIO(ctr *Container) (*netlink.LinkStatistics, error) { var netStats *netlink.LinkStatistics - err := ns.WithNetNSPath(ctr.state.NetNS.Path(), func(_ ns.NetNS) error { + netNSPath, netPathErr := getContainerNetNS(ctr) + if netPathErr != nil { + return nil, netPathErr + } + if netNSPath == "" { + // If netNSPath is empty, it was set as none, and no netNS was set up + // this is a valid state and thus return no error, nor any statistics + return nil, nil + } + err := ns.WithNetNSPath(netNSPath, func(_ ns.NetNS) error { link, err := netlink.LinkByName(ocicni.DefaultInterfaceName) if err != nil { return err diff --git a/libpod/stats.go b/libpod/stats.go index 7830919ba..61e85ed5e 100644 --- a/libpod/stats.go +++ b/libpod/stats.go @@ -66,8 +66,14 @@ func (c *Container) GetContainerStats(previousStats *ContainerStats) (*Container stats.BlockInput, stats.BlockOutput = calculateBlockIO(cgroupStats) stats.CPUNano = cgroupStats.CPU.Usage.Total stats.SystemNano = cgroupStats.CPU.Usage.Kernel - stats.NetInput = netStats.TxBytes - stats.NetOutput = netStats.RxBytes + // Handle case where the container is not in a network namespace + if netStats != nil { + stats.NetInput = netStats.TxBytes + stats.NetOutput = netStats.RxBytes + } else { + stats.NetInput = 0 + stats.NetOutput = 0 + } return stats, nil } -- cgit v1.2.3-54-g00ecf