diff options
author | Martin Holst Swende <martin@swende.se> | 2018-09-20 00:08:38 +0800 |
---|---|---|
committer | Felix Lange <fjl@users.noreply.github.com> | 2018-09-20 00:08:38 +0800 |
commit | 6f004c46d53958e2fe0e8aad5584a46f9f4bce6c (patch) | |
tree | 89667f749458f9c9f9c757e918cd42e7fd03ae03 /accounts/keystore/key.go | |
parent | 16e95f33b73b21dc77c7aab40b9764ecc38382a5 (diff) | |
download | go-tangerine-6f004c46d53958e2fe0e8aad5584a46f9f4bce6c.tar go-tangerine-6f004c46d53958e2fe0e8aad5584a46f9f4bce6c.tar.gz go-tangerine-6f004c46d53958e2fe0e8aad5584a46f9f4bce6c.tar.bz2 go-tangerine-6f004c46d53958e2fe0e8aad5584a46f9f4bce6c.tar.lz go-tangerine-6f004c46d53958e2fe0e8aad5584a46f9f4bce6c.tar.xz go-tangerine-6f004c46d53958e2fe0e8aad5584a46f9f4bce6c.tar.zst go-tangerine-6f004c46d53958e2fe0e8aad5584a46f9f4bce6c.zip |
accounts/keystore: double-check keystore file after creation (#17348)
Diffstat (limited to 'accounts/keystore/key.go')
-rw-r--r-- | accounts/keystore/key.go | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/accounts/keystore/key.go b/accounts/keystore/key.go index 211fa863d..9e3e4856c 100644 --- a/accounts/keystore/key.go +++ b/accounts/keystore/key.go @@ -179,26 +179,34 @@ func storeNewKey(ks keyStore, rand io.Reader, auth string) (*Key, accounts.Accou return key, a, err } -func writeKeyFile(file string, content []byte) error { +func writeTemporaryKeyFile(file string, content []byte) (string, error) { // Create the keystore directory with appropriate permissions // in case it is not present yet. const dirPerm = 0700 if err := os.MkdirAll(filepath.Dir(file), dirPerm); err != nil { - return err + return "", err } // Atomic write: create a temporary hidden file first // then move it into place. TempFile assigns mode 0600. f, err := ioutil.TempFile(filepath.Dir(file), "."+filepath.Base(file)+".tmp") if err != nil { - return err + return "", err } if _, err := f.Write(content); err != nil { f.Close() os.Remove(f.Name()) - return err + return "", err } f.Close() - return os.Rename(f.Name(), file) + return f.Name(), nil +} + +func writeKeyFile(file string, content []byte) error { + name, err := writeTemporaryKeyFile(file, content) + if err != nil { + return err + } + return os.Rename(name, file) } // keyFileName implements the naming convention for keyfiles: |