builder: ensure libnetwork state file do not leak
package buildkit
import (
+ "io/ioutil"
"os"
"path/filepath"
"strconv"
@@ -25,11 +26,24 @@ import (
const networkName = "bridge"
func newExecutor(root, cgroupParent string, net libnetwork.NetworkController, dnsConfig *oci.DNSConfig, rootless bool, idmap *idtools.IdentityMapping) (executor.Executor, error) {
+ netRoot := filepath.Join(root, "net")
networkProviders := map[pb.NetMode]network.Provider{
- pb.NetMode_UNSET: &bridgeProvider{NetworkController: net, Root: filepath.Join(root, "net")},
+ pb.NetMode_UNSET: &bridgeProvider{NetworkController: net, Root: netRoot},
pb.NetMode_HOST: network.NewHostProvider(),
pb.NetMode_NONE: network.NewNoneProvider(),
}
+
+ // make sure net state directory is cleared from previous state
+ fis, err := ioutil.ReadDir(netRoot)
+ if err == nil {
+ for _, fi := range fis {
+ fp := filepath.Join(netRoot, fi.Name())
+ if err := os.RemoveAll(fp); err != nil {
+ logrus.WithError(err).Errorf("failed to delete old network state: %v", fp)
+ }
+ }
+ }
+
return runcexecutor.New(runcexecutor.Opt{
Root: filepath.Join(root, "executor"),
CommandCandidates: []string{"runc"},
@@ -117,7 +131,10 @@ func (iface *lnInterface) Close() error {
if iface.sbx != nil {
go func() {
if err := iface.sbx.Delete(); err != nil {
- logrus.Errorf("failed to delete builder network sandbox: %v", err)
+ logrus.WithError(err).Errorf("failed to delete builder network sandbox")
+ }
+ if err := os.RemoveAll(filepath.Join(iface.provider.Root, iface.sbx.ContainerID())); err != nil {
+ logrus.WithError(err).Errorf("failed to delete builder sandbox directory")
}
}()
}
