Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 19 additions & 18 deletions cli/config/configfile/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"os"
"path/filepath"
"strings"
"syscall"

"github.com/docker/cli/cli/config/credentials"
"github.com/docker/cli/cli/config/types"
Expand Down Expand Up @@ -194,37 +195,37 @@ func (configFile *ConfigFile) Save() (retErr error) {
if err := os.MkdirAll(dir, 0700); err != nil {
return err
}
temp, err := ioutil.TempFile(dir, filepath.Base(configFile.Filename))

// Handle situation where the configfile is a symlink
cfgFile := configFile.Filename
if f, err := os.Readlink(cfgFile); err == nil {
cfgFile = f
}

f, err := os.OpenFile(cfgFile, os.O_CREATE|os.O_WRONLY, 0600)
if err != nil {
return err
}
defer func() {
temp.Close()
if retErr != nil {
if err := os.Remove(temp.Name()); err != nil {
logrus.WithError(err).WithField("file", temp.Name()).Debug("Error cleaning up temp file")
}
err = syscall.Flock(int(f.Fd()), syscall.LOCK_UN)
if err != nil {
logrus.WithError(err).WithField("file", cfgFile).Error("Unable to unlock config file")
}
f.Close()
}()

err = configFile.SaveToWriter(temp)
err = syscall.Flock(int(f.Fd()), syscall.LOCK_EX)
if err != nil {
logrus.WithError(err).WithField("file", cfgFile).Error("Unable to lock config file")
return err
}

if err := temp.Close(); err != nil {
return errors.Wrap(err, "error closing temp file")
}

// Handle situation where the configfile is a symlink
cfgFile := configFile.Filename
if f, err := os.Readlink(cfgFile); err == nil {
cfgFile = f
err = f.Truncate(0)
if err != nil {
return err
}

// Try copying the current config file (if any) ownership and permissions
copyFilePermissions(cfgFile, temp.Name())
return os.Rename(temp.Name(), cfgFile)
return configFile.SaveToWriter(f)
}

// ParseProxyConfig computes proxy configuration by retrieving the config for the provided host and
Expand Down
35 changes: 0 additions & 35 deletions cli/config/configfile/file_unix.go

This file was deleted.