aboutsummaryrefslogtreecommitdiffstats
path: root/agent/findkey.c
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2016-10-21 01:57:29 +0000
committerNIIBE Yutaka <[email protected]>2016-10-21 01:57:29 +0000
commit1ffd475f99eaff4e40950eda88702f8db9288eb5 (patch)
treecc3b85d36b5638c77377302ec76679e4b3544f71 /agent/findkey.c
parenttests: Simplify test. (diff)
downloadgnupg-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]>
Diffstat (limited to 'agent/findkey.c')
-rw-r--r--agent/findkey.c25
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 ();