From 1ffd475f99eaff4e40950eda88702f8db9288eb5 Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Fri, 21 Oct 2016 10:57:29 +0900 Subject: [PATCH] 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 --- agent/findkey.c | 25 +++++++++++++++++++------ 1 file 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 ();