From c6fda444b7c61e3bb2c05235bc29f2318ec304a5 Mon Sep 17 00:00:00 2001 From: fupan Date: Tue, 24 Jul 2018 09:49:42 +0800 Subject: [PATCH] virtconainers: rollback the NetNs when createNetwork failed When createNetwork failed, cleanup the NetNs if it created. Fixes: #508 Signed-off-by: fupan --- virtcontainers/sandbox.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/virtcontainers/sandbox.go b/virtcontainers/sandbox.go index 316dbd72c..7d16ec1a9 100644 --- a/virtcontainers/sandbox.go +++ b/virtcontainers/sandbox.go @@ -906,8 +906,20 @@ func (s *Sandbox) Delete() error { } func (s *Sandbox) createNetwork() error { + var netNsPath string + var netNsCreated bool + var networkNS NetworkNamespace + var err error + + //rollback the NetNs when createNetwork failed + defer func() { + if err != nil && netNsPath != "" && netNsCreated { + deleteNetNS(netNsPath) + } + }() + // Initialize the network. - netNsPath, netNsCreated, err := s.network.init(s.config.NetworkConfig) + netNsPath, netNsCreated, err = s.network.init(s.config.NetworkConfig) if err != nil { return err } @@ -920,14 +932,16 @@ func (s *Sandbox) createNetwork() error { } // Add the network - networkNS, err := s.network.add(s, s.config.NetworkConfig, netNsPath, netNsCreated) + networkNS, err = s.network.add(s, s.config.NetworkConfig, netNsPath, netNsCreated) if err != nil { return err } s.networkNS = networkNS // Store the network - return s.storage.storeSandboxNetwork(s.id, networkNS) + err = s.storage.storeSandboxNetwork(s.id, networkNS) + + return err } func (s *Sandbox) removeNetwork() error {