diff options
author | NIIBE Yutaka <[email protected]> | 2016-10-21 01:57:29 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2016-10-21 01:57:29 +0000 |
commit | 1ffd475f99eaff4e40950eda88702f8db9288eb5 (patch) | |
tree | cc3b85d36b5638c77377302ec76679e4b3544f71 | |
parent | tests: Simplify test. (diff) | |
download | gnupg-1ffd475f99eaff4e40950eda88702f8db9288eb5.tar.gz gnupg-1ffd475f99eaff4e40950eda88702f8db9288eb5.zip |
agent: Fix saving with FORCE=1.
* agent/findkey.c (agent_write_private_key): Recover from an error of
GPG_ERR_ENOENT when FORCE=1 and it is opened with "rb+".
--
Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r-- | agent/findkey.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/agent/findkey.c b/agent/findkey.c index 23e94f0dd..162e8c215 100644 --- a/agent/findkey.c +++ b/agent/findkey.c @@ -152,17 +152,30 @@ agent_write_private_key (const unsigned char *grip, if (!fp) { gpg_error_t tmperr = gpg_error_from_syserror (); - log_error ("can't create '%s': %s\n", fname, gpg_strerror (tmperr)); - xfree (fname); - return tmperr; - } - /* See if an existing key is in extended format. */ - if (force) + if (force && gpg_err_code (tmperr) == GPG_ERR_ENOENT) + { + fp = es_fopen (fname, "wbx,mode=-rw"); + if (!fp) + { + tmperr = gpg_error_from_syserror (); + goto error; + } + } + else + { + error: + log_error ("can't create '%s': %s\n", fname, gpg_strerror (tmperr)); + xfree (fname); + return tmperr; + } + } + else if (force) { gpg_error_t rc; char first; + /* See if an existing key is in extended format. */ if (es_fread (&first, 1, 1, fp) != 1) { rc = gpg_error_from_syserror (); |